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のスクリプト実行シーケンスに秘密がある。

と、今日はここで時間切れ。続きは明日まとめよう。