VirtualBox+vagrantのHomesteadで、Laravel環境構築にて、固定IPアドレスを設定し、
外部から接続する際に、接続できるアプリにアクセスできず、もう1つのアプリばかりアクセスできる。
『なぜだ?』と原因が分からずに四苦八苦し、やっと解決できたので、忘れないうちにメモとして投稿します。
環境
- 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: ※ネットワークインターフェースにて、固定IPアドレスを指定する
- 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の完了を待つのみ
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
表示させたいのは、①のアプリになりますが、
上記の記述通りに行うと・・・②のアプリ(PhpMyAdmin)が表示されます。
アプリを指定するような記述は
Laravel 8.x Laravel Homestead(公式サイト)にもそれらしいものはない・・・
どうすれば、意図したアプリにアクセスできるようになる?
答えは単純でした。
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
を入力すると
このようにネットワークの情報が出力されます。
使用したいアダプタの説明に項目にアダプタ名が表示されるので、こちらをbridge接続する場合は記述します。
networks:
- type: "public_network"
ip: "192.168.1.20"
bridge: "Intel(R) Ethernet Connection (11) I219-LM"
ちなみに・・・
ブリッジ接続とは、それぞれ異なるネットワークに属しているPC同士を通信できるようにする接続方法です。