Apache(mod_proxy_balancer) + mongrelで運用するときの注意点
Railsをproduction環境で運用していると、こんなエラーが頻発していることに気が付いた。
Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET] Session ID: 006a27e09f46dfe1bd6f6cc2258cfa8e Parameters: {} ActionController::RoutingError (no route found to match "/" with {:method=>:get} ): /vendor/rails/actionpack/lib/action_controller/routing.rb:1292:in `recognize _path' /vendor/rails/actionpack/lib/action_controller/routing.rb:1282:in `recognize ' /vendor/rails/railties/lib/dispatcher.rb:40:in `dispatch' /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/rails.rb:78:in ` #=> 長いので省略
今のシステムではmongrelに対してルートにアクセスする事はない。原因が分からなくてかなり困る。
Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET]
forの後ろにある「::1」と言う値には本来ホスト名やIPが入るはずなのだが…。謎なんだけど、記号だからググる事も出来ない。
とりあえず仮受け用にroutes.rbを編集してrequest.envを出力するアクションを作って結果を見ると、UserAgentにこんな値が。
"HTTP_USER_AGENT"=>"Apache (internal dummy connection)
…Apacheから?
今度はググれそうなのでググって見ると原因を解説しているサイトを発見。
When the Apache HTTP Server manages its child processes, it needs a way to wake up processes that are listening for new connections.
http://wiki.apache.org/httpd/InternalDummyConnection
mod_proxyなどで子供のサーバをぶら下げていると、Apacheは死活監視用のHTTPリクエストを送るらしい。
Railsはデフォルトのままでルートにアクセスするとdispacherがpublic/index.htmlに読み替えてWelcome Abord画面を表示するんだけど、これが不要だったからpublic/index.htmlを削除していた。これが直接的な原因っぽい。
空ファイルでも良いのでindex.htmlを置いておけばエラーは出なくなるはず、という事でやってみた結果、エラーは出なくなった。
という事で、Apacheでmod_proxy_balancerを使用しているときはproxy先で死活監視のHTTPアクセスを忘れないこと。
とりあえず空のindex.htmlを置いておくのが一番良いと思う。
ちなみに::1と言うのはループバック用のアドレスらしい。
死活監視用のリクエストヘッダは以下のようになっている。
"REMOTE_ADDR"=>"::1" "HTTP_X_FORWARDED_FOR"=>"::1"
でもなんでループバック用のアドレスになってるんだろ…。