VagrantのWebサーバーをmDNSでLAN内からアクセスできるようにしてみた
Webサーバーと通信するスマホアプリの開発をしようと思ってVagrantでWebサーバーを構築していた。
LAN内の開発用スマホからそのサーバーにアクセスするのにmDNSを使えたら、Vagrantを動作させるパソコンが変わってもスマホ側のコードを修正せずに済むと思ってmDNSを使ってみることにした。
この記事はcentos/7のboxから生成した仮想マシン前提です。
mDNSってなに?
macを複数台持ってる人なら知っているであろう、IPアドレスを入力せずとも[ホスト名].localで名前解決してLAN内のパソコンにアクセスできるようにするサービスのこと。
これを使えばローカルDNSサーバーを用意しなくてもLAN内のパソコンを名前解決できるようになる。
このように専用のサーバーなどを用意せずにIPネットワークを自動で構築するサービスのことをZeroconfというらしい。詳しくはWikipediaで見てくれ。
AppleのBonjourで使われており、iTunesをインストールすればWindowsでも使えるようになるので比較的利用しやすく、しかもWindows 10からは標準でmDNSに対応してiTunesのインストールも必要なくなったので使いやすい。
ただ、問題はAndroidが対応していないことで、Androidで名前解決するには素直にDNSサーバーを立てる必要があるのでご注意を。
ブリッジネットワークの設定
LAN内のデバイスからアクセスするには仮想マシンのネットワーク設定をNATではなくブリッジにする必要があります。
VirtualBox on OS X にて Vagrant で複数 VM を起動するとき、public_network を使っていると毎度ブリッジインタフェースの選択が面倒です。 各 VM の起動時に都度選択画面が出るので、全台起動するまでターミナルに張り付いていないといけません。...
ここを参考に、デフォルトのNICをブリッジさせるようにVagrantfileを設定します。
VagrantfileのVagrant.configure("2") do |config|
からend
までの間のどこかに
bridge_if = %x(VBoxManage list bridgedifs | grep '^Name:' | head -n 1).chomp.sub(/^Name: +/, "")
config.vm.network "public_network", bridge: bridge_if, use_dhcp_assigned_default_route: true
を追記します。保存したら
$ vagrant reload
で仮想マシンを再起動してください。
hostnameの設定
ゲストOSに設定されているホスト名を使って、 (ホスト名).localのドメイン名でアクセスすることになります。
centos/7の標準だとlocalhost.localdomain
になってるので、これを好きなものに変更します。
ゲストOS上のターミナルで以下のコマンドを実行します。
[vagrant@localhost ~]$ sudo hostnamectl set-hostname (ホスト名)
例えば、"webserver.local"でアクセスしたかったら、
[vagrant@localhost ~]$ sudo hostnamectl set-hostname webserver
と実行します。
あとは、一旦exitでセッションを閉じてから、再度vagrant sshでログインすればホスト名が変更されています。
avahiのインストール
avahiは、linuxでmDNSを扱ってくれる便利なソフトです。
ゲストOS上のターミナルで
[vagrant@localhost ~]$ sudo yum install -y avahi
を実行して、
[vagrant@localhost ~]$ sudo systemctl start avahi-daemon
[vagrant@localhost ~]$ sudo systemctl enable avahi-daemon
で起動・有効化します。
接続テスト
これでpingとか通るはずです。
ping (ホスト名).local
あとは、ゲストOSでwebサーバーを動作させているなら、同じLAN内のパソコンやスマホのブラウザから"http://(ホスト名).local"にアクセスしてwebページが表示されるか確認してください。
コメント