2008-02-11 [長年日記]
■ [Microsoft][Ruby]IIS7.0 + FastCGI on Windows 2008 Server で ruby を動かす
今、簡単なRailsアプリを純MS環境(Windows Server + IIS + SQLServer)で動かそうと悪戦苦闘中です。
なかなかIIS7.0以前の情報なら色々引っかかったり、2008ServerのBeta3以前の情報となると見つかるんですが、少し手順など調べて回ったものと違っていたり、流石に2008Serverの製品版以降の情報がほとんど見つからなかったので、ちょっと書いてみます。
2008ServerのIIS7.0からデフォルトインストール時にFastCGIがバンドルされるようになりました。VistaではFastCgiModuleというモジュールを追加することで、使うことが出来るようになります。これもPHPをFastCGIで動かしたいという世間の意向からZend社との協業でできたものらしいです。IIS5や6でも使えますが、IISではデフォで使えると。ちなみに、Vistaと2008ServerのIISの違いは基本的に同じものでモジュールの違いと同時接続数などのリソース制限があるだけです。
で、2008 Server でFastCGIを動かすためには、IISのインストール時にCGIモジュールをインストールするのみです。このモジュールをインストールすると、CgiModuleとFastCgiModuleという2つのモジュールがインストールされます。これで、準備は完了
つぎに、FastCgiModuleで動かすもののひもづけをおこないます。IISマネージャを開いて、サイトをつっつくと「機能ビュー」の中にハンドらマッピングというのがあります。ここで画面左側の「モジュールマップの追加」を選ぶ。すると、画像のようなウィンドウが開きますので、画像の例のように入力。これは非常に使いにくいんですが、rubyの本体
*1
にパイプで以下のようにfcgiファイルを渡さないといけない。
C:\ruby\bin\ruby.exe|C:\inetpub\wwwroot\test.fcgi
つまり、fcgiのものが複数あれば複数ハンドラを登録しないと行けません。
逆に単なるCGIとしてのハンドラを登録するには「モジュールマップの追加」ではなく「スクリプトマップの追加」で「実行可能ファイル」を
C:\ruby\bin\ruby.exe "%s" %s
と設定します。(最初の%sにはrbファイル、2番目の%sはscript自体の引数が渡されるものと思われます。)
これで、IIS上でrubyをFastCGIで動かせるようになります。Railsでは入口は dispatch.fcgi なので、これだけ登録すれば必要十分ですね。
とりあえず、これでIISでFastCGIを使うことができたんですが、isapi_rewrite で悪戦苦闘中です。ちょっと mod_rewrite と違うみたいなんですね。。。ちなみに、IIS7.0用の isapi_rewrite は isapi_rewrite 3 Liteとして、Freewareで提供されています。(多分Rewrite出来るモジュールのなかでこれが唯一の無償版)でも、機能制限なのが泣ける。。。
ちなみに、IIS7.0はちょっと面白い機能がありました。外部からのアクセスに対して例えば404や500などのErrorPageを表示するのは当然なのですが、再現性のあるようなエラーにおいて、'http://localhost/' とサーバ名を指定して、同じURLを叩くと別の画面が出てきます。エラー内容を詳細に出力して、考えられる(一般的な)原因とその対策などを表示してくれます。これはVistaのIISも同様。「手元でのデバッグ作業の足しにしてくれ」という機能のようです。
(追記)設定はこれでいいんだけど、dllのバージョンの関係で安定して動かない。これはdllのバージョンをIISで使うdllのバージョンをあわせればいいのかも。。。確認中
*1 ちなみに、Ruby本体はOne-Click Ruby Installer (http://rubyforge.org/projects/rubyinstaller/)をインストールしてます。ちなみに、RubyForIISは使ってません。使った方がいいのかなぁ…(One-Click Ruby Installerにそのまま入っているfcgi.soとか使ってます。)