ローカルで動かしていたSinatraをさくらvpsで動かそうと思ったら、アクセスしても繋がらない問題に出くわしました(;´д`)
検索しても意外と情報が少なかったのでメモ残しときます。
##症状
Sinatraを使ったコードを実行すると、デフォルトだと4567番ポートで立ち上がるのですが、アクセスしても繋がらない!!
$ bundle exec ruby hoge.rb
[2013-05-17 23:58:37] INFO WEBrick 1.3.1
[2013-05-17 23:58:37] INFO ruby 1.9.3 (2013-02-06) [x86_64-linux]
== Sinatra/1.4.2 has taken the stage on 4567 for development with backup from WEBrick
[2013-05-17 23:58:37] INFO WEBrick::HTTPServer#start: pid=10077 port=4567
初めはiptablesの設定が悪いのかとか、別のところで何かブロックされてるんじゃないかとか悩んでいたのですが、iptablesの設定をオフにしても繋がらなかったので原因は別にある事が判明。netstatをしたら、localhostからのアクセスしかLISTENしていない事が分かりました。
$ netstat -an
# 必要部分だけ抽出
tcp 0 0 127.0.0.1:4567 0.0.0.0:* LISTEN
という事は、SinatraのListenAddressの設定がおかしい!!
##原因
以前Sinatraを利用した時は、特に何もしなくても外部から繋がっていたのでおかしいなと思いながら調べていると以下の記述を発見!
:bind - server hostname or IP address
String specifying the hostname or IP address of the interface to listen on when the :run setting is enabled. The default value in the development environment is 'localhost' which means the server is only available from the local machine. In other environments the default is '0.0.0.0', which causes the server to listen on all available interfaces.
引用元:Sinatra: Configuring Settings
なんとdevelopment環境だと、localhostからのアクセスしか受け付けないのがデフォルトらしい!!
でも今まではそんな事なかったし、日本語訳の資料にはこんな記述なかったので、最近の変更なのかなーとSinatraの変更履歴を見てみたところ
= 1.4.0 / 2013-03-15
~ 省略 ~
- Default to only serving localhost in development mode. (Postmodern)
引用元:sinatra/CHANGES at 1.4.2 · sinatra/sinatra · GitHub
あったよー!ver.1.4.0からこのような仕様になったんですね。3月の変更だから結構最近。
##対応方法
ListenAddressを設定するオプションがあるので、そちらを使えばOKです。(0.0.0.0 は全てのアドレスを指す)
###実行オプションを使う
$ bundle exec ruby hoge.rb -o 0.0.0.0
###rubyのコードの中で設定する
set :bind, '0.0.0.0'
environment を変えてもいける
ドキュメントに書かれている通り、ローカルからしか繋がらないのは 'development' の時だけなので、environmentに、'production' や 'test' を設定した時は何もしなくても外部から繋がります。
###実行オプションを使う
$ bundle exec ruby hoge.rb -e production
###rubyのコードの中で設定する
set :environment, :production