Homestead環境でアプリを外部から接続したら、ドハマりしてしまったこと

VirtualBox＋vagrantのHomesteadで、Laravel環境構築にて、固定IPアドレスを設定し、
外部から接続する際に、接続できるアプリにアクセスできず、もう１つのアプリばかりアクセスできる。
『なぜだ？』と原因が分からずに四苦八苦し、やっと解決できたので、忘れないうちにメモとして投稿します。

# 環境
+ OS : windows11 pro
+ VirtualBox (5.2.44)
+ vagrant (2.2.5)
+ Laravel 8.x Laravel Homestead

# Homestead.yaml
App名等は、違う名前だが中身はこんな感じです。
sitesに記述した複数のアプリ（myappとapp）外部接続ip:192.168.1.20にアクセスし、アプリを表示させたいのはmyappの方とします。
```
ip: "192.168.56.56"
memory: 2048
cpus: 2
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: C:¥Users¥ユーザ名¥Documents¥laravel
      to: /home/vagrant/code
   
sites:　※複数のアプリが存在
    - map: myapp
      to: /home/vagrant/code/myapp/public
- map: app
      to: /home/vagrant/code/app/public

databases:
    - homestead

features:
    - mysql: true
    - mariadb: false
    - postgresql: false
    - ohmyzsh: false
    - webdriver: false

services:
    - enabled:
          - "mysql"
networks:  ※ネットワークインターフェースにて、固定ＩＰアドレスを指定する
    - type: "public_network"
      ip: "192.168.1.20"
      bridge: "Intel(R) Ethernet Connection (11) I219-LM"
```

# ネットワークインターフェースの設定の説明
## Homestead.yamlで設定する場合
### bridgeを設定しない場合
```
networks: 
    - type: "public_network"
        ip: "192.168.1.20
```

コマンドプロンプトにて、以下の内容でnetwork interfacesの設定を行う
```
PS C:¥Users¥ユーザ名¥Documents¥laravel> vagrant reload --provision
==> homestead: Attempting graceful shutdown of VM...
==> homestead: Checking if box 'laravel/homestead' version '12.2.0' is up to date...
==> homestead: Clearing any previously set forwarded ports...
==> homestead: Clearing any previously set network interfaces...
==> homestead: Available bridged network interfaces:
1) Intel(R) Ethernet Connection (11) I219-LM　　→ イーサネットのアダプタ名
2) Hyper-V Virtual Ethernet Adapter
==> homestead: When choosing an interface, it is usually the one that is
==> homestead: being used to connect to the internet.
==> homestead:
    homestead: Which interface should the network bridge to? 1　→ イーサネットを選択する
```

外部ネットワークに接続するため、イーサネットのアダプタを選択し、provisionの完了を待つ

### bridgeを設定した場合
```
networks: 
    - type: "public_network"
      ip: "192.168.1.20"
      bridge: "Intel(R) Ethernet Connection (11) I219-LM"
```
Homestead.yamlを修正している場合は
``vagrant reload --provision``を実行する。
修正なしの場合
``vagrant up``でOK。

Homestead.yamlのbridgeで指定しているため、network interfacesは聞いてこない。
provisionの完了を待つのみ

:::note info
IPアドレス（ホストアドレス）は空いているものなら何でもいいが、LAN内のサブネットを指定しないと繋がらないため注意が必要
ホストアドレスとは、今回でいうと192.168.1.20の20の部分のこと。192.168.1はネットワークアドレス。
:::

## homestead.rbで設定する場合
homestead.rbでも、ネットワークインターフェースを設定することはできる
```
# Configure A Private Network IP
    if settings['ip'] != 'autonetwork'
      config.vm.network :private_network, ip: settings['ip'] ||= '192.168.10.10'
    else
      config.vm.network :private_network, ip: '0.0.0.0', auto_network: true
    end
```
の下に、下記の記述を加える。
```
config.vm.network "public_network", :bridge => "Intel(R) Ethernet Connection (11) I219-LM", :ip => "192.168.1.20"
```

Homestead.yaml （bridgeを設定した場合）同様、provisionの完了を待つのみ


# 複数アプリが存在する場合
```
sites:　※複数のアプリが存在
    - map: myapp　・・・ ⓵
      to: /home/vagrant/code/myapp/public
- map: app ・・・ ⓶
      to: /home/vagrant/code/app/public
```
以下が、それぞれのアプリとします。
①のアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727339/33a679cb-581e-3f35-7631-6d3838b1a17f.png)

②のアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727339/ef07a40e-c490-9182-8a25-a810bb1b56ff.png)

表示させたいのは、①のアプリになりますが、
上記の記述通りに行うと・・・②のアプリ（PhpMyAdmin）が表示されます。

アプリを指定するような記述は
[Laravel 8.x Laravel Homestead(公式サイト)](https://readouble.com/laravel/8.x/ja/homestead.html "公式")にもそれらしいものはない・・・
どうすれば、意図したアプリにアクセスできるようになる？

答えは単純でした。
https://sakamata.hateblo.jp/entry/2019/02/18/111734　← こちらのサイトに書いてありました。

>Homestead.で複数のアプリを設定して外部端末からpublic_networkのipアドレスでアクセス場合
sites: の -map に指定するドメインの**アルファベットの最昇順のサイト**が表示されるらしい・・・

つまり、今回でいうと① myappよりも② appの方が昇順になるため、② appのアプリが表示されたのです。

適当だが、下記のように修正すれば、表示させたいアプリ（①）を②のアプリよりも昇順になり、意図したアプリを表示させることができるようになります。
```
sites: 
    - map: app　・・・ ⓵
      to: /home/vagrant/code/myapp/public
- map: myapp ・・・ ⓶
      to: /home/vagrant/code/app/public
```

このようなことにドハマりし、時間を費やしたが、いい経験になりました。

# おまけ（アダプタ名の確認方法）
コマンドプロンプトにて、``ipconfig/all``を入力すると
![ipconfig_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727339/322c556a-b42f-6c27-5b63-0afa9cfd47c7.png)
このようにネットワークの情報が出力されます。
使用したいアダプタの**説明**に項目にアダプタ名が表示されるので、こちらをbridge接続する場合は記述します。
```
networks: 
    - type: "public_network"
      ip: "192.168.1.20"
      bridge: "Intel(R) Ethernet Connection (11) I219-LM"
```

:::note info
ちなみに・・・
ブリッジ接続とは、それぞれ異なるネットワークに属しているPC同士を通信できるようにする接続方法です。
:::