Rails つまみぐい

Rails つまみぐい

Ruby on Rails 初学者による行き当たりばったりなメモ

仮想サーバ上の WEBrick にローカルマシンから接続できない?!

しばらく Rails と離れていたのですが、久々に戻って参りました。気がつけば Rails5 がもう目の前!時が経つのは早いものです。

世の中の流れから置いていかれている感が半端ないので、また一から勉強っつぅ事で、つまづいたり調べたりした事をボチボチと書いていこうと思ってます。

仮想サーバの WEBrick にローカルマシンから繋がらない!

さて、ここんとこ巷で流行っている Vagrant + VirtualBox を使って仮想サーバに CentOS をインストールして、そこに開発環境を作るぜー!とやってみています。

とりあえず、chruby と ruby-install を使って ruby を入れて、rails も入れて、rails new して、bin/rake db:create して... さぁ準備OK!ってところで

$ bin/rails s

とやって WEBrick の Web サーバを起動したのですが、ローカルマシンから繋がらない...??


ちなみに Vagrantfile では、下記のようにポートフォワードの設定をしているので

config.vm.network "forwarded_port", guest: 3000, host: 4000

ローカルマシンのWebブラウザで http://localhost:4000 を叩いてみるも返事なし...

仮想サーバに ssh ログインした状態で、

$ curl -v 'http://localhost:3000/'

ってコマンド打ってみると、ちゃんと html 形式のレスポンスが帰ってきたので、WEBrick は動いている模様。

むむぅ、もしかして iptables 辺りが原因か?と疑ったが、特に設定してなかった...。


ググってみると、どうやら WEBrick が listen する際のアクセス元IPアドレスが、Rails 4.1 までのデフォルトが 0.0.0.0 だったのに対し、Rails 4.2 からは 127.0.0.1 に変更になったそうです。

ちなみに、0.0.0.0 というのは任意のIPアドレス(any)という意味だそうで、どこからでもアクセスできますよ、という状況だったのを 127.0.0.1 (localhost) からしか、つまり仮想サーバ自身からしか繋がらないよというように変更したということですね。

ま、開発用のWebサーバに、あちこちのマシンからアクセスできるのは、ちょっとイケテナイねということなのでしょう。仕方ありません。


解決策1. WEBrick 起動時にオプション指定

WEBrick を起動する際に、オプションでIPアドレスとして 0.0.0.0 を指定すれば良いとのこと。

$ bin/rails s --bind=0.0.0.0

または

$ bin/rails s -b 0.0.0.0

無事、ローカルマシンのWebブラウザから http://localhost:4000 で繋げました。

仮想サーバ上で netstat コマンドを叩いてみると

$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 0.0.0.0:3000              0.0.0.0:*                   LISTEN      

ってなってますが、--bind オプション無しで netstat を叩くと

$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 127.0.0.1:3000              0.0.0.0:*                   LISTEN      

ってなってます。この状態だと、ローカルマシンからアクセスできないってことですね。

解決策2. WEBrick のデフォルトの設定を変える

WEBrick を起動するたびに --bind オプションをくっつけるのはチト面倒くさい。

ということで、デフォルトで 0.0.0.0 をバインドするように変更します。

config/boot.rb の末尾に、以下を追加して Rails::Server のデフォルトオプションを追加すると良いみたい

require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host:  '0.0.0.0', Port: 3000)
    end
  end
end

これで

$ bin/rails s

を叩くだけで、0.0.0.0 をバインドしてくれます。めでたし、めでたし。