Mongrelのオプションを通常のserverスクリプトから設定する
Railsのサーバとして使うMongrelには特徴的なオプションが多数あるが、それらはMongrelのコマンドから使用することを前提にしている。
mongrel_rails start -e development --prefix /addressbook
MongrelはインストールされるとRailsのサーバ起動スクリプトと統合されるため、Mongrelを起動する場合であっても、通常は以下のようにサーバを意識しないコマンドを使うることが多いだろう。
ruby script/server -e development
このコマンド形式はテストとプロダクションでサーバが違っても透過に扱えるので便利なのだが、なぜかMongrelのオプションが通らず、使えないのである。
ruby script/server -e development --prefix /addressbook : => Booting Mongrel (use 'script/server webrick' to force WEBrick) server: invalid option: --prefix
"--prefix"オプションがMongrelまで渡っていないようだ。
エントリポイントになっていると思われるmongrel.rb(ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/commands/servers/mongrel.rb)を見てもそれっぽい記述('-P'もしくは'--prefix'を処理している箇所)が無い。これはいよいよ自分でスクリプトを修正するかと思ったが、これは既知らしくRails Tracに以下のパッチを見つけた。
#10674 ([PATCH] Add --prefix option to script-server with Mongrel) - Rails Trac - Trac
#10674 add_prefix_option_to_script_server_for_mongrel.patch - Rails Trac - Trac
内容もそれっぽいんでとりあえずdiffの通りにmongrel.rbを直接修正して、"--prefix"オプションを付けてスクリプトを実行してみよう。
>ruby script/server --prefix /addressbook => Booting Mongrel (use 'script/server webrick' to force WEBrick) => Rails 2.2.2 application starting on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server ** Starting Mongrel listening at 0.0.0.0:3000 ** Starting Rails with development environment... ** Mounting Rails at /addressbook... ** Rails loaded. ** Loading any Rails specific GemPlugins ** Signals ready. INT => stop (no restart). ** Mongrel 1.1.5 available at 0.0.0.0:3000 ** Use CTRL-C to stop. DEPRECATION WARNING: ActionController::AbstractRequest.relative_url_root= has been renamed.You can now set it with config.action_controller.relative_url_root=. (called from rails at e:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.5-x86-mswin32-60/bin/../lib/mongrel/rails.rb:151)
おお、上手くいったぞ。(relative_url_rootを設定することになるためにワーニングが出ているのが気持ち悪いが..)
上記のように直接スクリプトを修正するのは簡単だが、gemからインストールしたソースコードを安易に変えてしまうのは良くないだろう。Rubyは元々UNIX文化で育ってきたプラットホームだし、パッチの当て方も含めて「郷に入れば郷に従え」ということで、正しい方法を調べる必要がある。
また、このパッチだが、対象のディレクトリを見るとrailties/lib/commands/servers/mongrel.rbと、インストールされているmongrel.rbとは全く違うディレクトリを指している。
調べるまで全く理解不能だったのだが、これはRailsのバージョン固定機構と、Railsのスクリプト実行シーケンスに秘密がある。
と、今日はここで時間切れ。続きは明日まとめよう。