仮想環境内でRailsを立ち上げる時に、意味がわからず、オプションとして-b 0.0.0.0をつけていませんか?
-bオプションの意味を説明したいと思います。今回はvagrantという仮想環境マネージャーを用いて、仮想環境内でRailsアプリケーションを作成している場合について書きます。
##はじめに
多くの人は、railsサーバをrails sコマンドで立ち上げて、webブラウザを開き、http://localhost:3000 などのurlにアクセスして、 Railsアプリケーションを作成していると思います。まず、この意味としては当たり前ですが、localhostのポート3000番で立ち上がっているRailsアプリケーションにブラウザからアクセスするという意味です。
ポートフォワーディングとは
仮想環境内で立ち上がっているRailsアプリケーションを仮想環境の外のブラウザで見るためにはポートをフォーワーディングする必要があります。vagrant upというコマンドを打っているディレクトリにある、vagrantfileに以下のような記述があるのではないでしょうか?
# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
config.vm.network "forwarded_port", guest: 3000, host: 3000
これは、guestマシン(物理的なパソコン)のポートをhostマシン(仮想マシン)のポートにフォーワーディングしているという意味です。この記述があるからこそ、仮想マシンで立ち上がっているRailsアプリケーションに仮想マシンの外にあるブラウザからアクセスできるのです。
##バインディングアドレスとは
Railsのプロセスは、外部からのリクエストを受け付けるためにRailsプロセスが動いているホストが持っているipアドレスに結び付けられています。その結び付けられているアドレスをバインディングアドレスといいます。
以前は、デフォルトで、ipアドレス0.0.0.0に結び付けられていましたが、一時期から開発環境では、127.0.0.1(localhost)に結び付けられるようになりました。
##ループバックアドレスとは
ループバックアドレスとは、使っているPCそのものを表すipアドレスであり、127.0.0.1というipアドレスが一般的には割り当てられています。そして、このipアドレスのホスト名として、localhostという名前が割り当てられています。
そのため、http://localhost:3000 として、ブラウザで開いていたところを http127.0.0.1:3000として開いてみても同じように開くことができると思います。
そして、このループバックアドレスというのは、外部から(今回の場合は仮想環境の外から)はアクセスすることができません。内部からのみアクセスすることができます。
その例を示したいと思います。
仮想マシン内で、localhost(127.0.0.1)にipアドレスをバインディングさせ、簡単なwebサーバを立ち上げてみます。
下のコマンドを打ってみてください。
ruby -run -e httpd . -p 3000 -b 127.0.0.1
そして、仮想マシン内と、仮想マシン外から、curlコマンドを使って、アクセスできるか調べてみます。
curl localhost:3000
上のコマンドを仮想マシン内から叩いた時には、レスポンスが帰ってきたと思いますが、仮想マシンの外から叩いた時は、レスポンスが帰って来ず、接続できません。という文字が返ってきたと思います。
このように、localhostで立ち上がっている、プロセスは、外部からはアクセスできません。
##ipアドレス0.0.0.0の意味
最後にipアドレス0.0.0.0の意味を説明したいと思います。
前提として、マシンというのは複数のネットワークインターフェースを持っています。つまりは複数のipアドレスを持っているということです。
ifconfigコマンドでネットワークインターフェースの一覧表示をすることができます。
また、grepで値を絞ることにより、ipアドレスを持っているネットワークインターフェースのipアドレス部のみを見ることができます。
ifconfig | grep "inet "
そして、ipアドレス0.0.0.0は、表示されたipアドレス全てを表しています。
そして、-bオプションというのは、Railsのプロセスをどのipアドレスにバインドするかというものです。
つまりは、rails s -b 0.0.0.0というコマンドはRailsのプロセスをipアドレス0.0.0.0だけではなく、仮想マシンが持っている全てのipアドレスにバインディングしているという意味です。
そのため、外部からアクセスできない、127.0.0.1だけではなく、外部からアクセスできる他のipアドレス(192.168.??.??)などにもバインディングされているため、仮想マシン内からだけではなく仮想マシンの外からもアクセスできます。
##まとめ
・ipアドレス127.0.0.1(localhost)は仮想環境外部からはアクセスできない。
・仮想マシンは複数のネットワークインターフェースを持っており、ipアドレス127.0.0.1以外は外部からアクセスできる。
・開発環境では、rails sとすると、railsプロセスはlocalhost(127.0.0.1)にバインディングされる。
・-b 0.0.0.0というオプションをつけると、仮想マシンが持っている全てのネットワークインターフェースにバインディングされるため、仮想環境外部からアクセスできる。