MongrelとIIS7を統合する(Application Request Routing ModuleでIIS7をリバースプロキシ化する)

残念だがIIS+FastCGI+RubyForIISの不安定さに絶望したので(私の環境だけだろうと信じたい)とっとと構成を変えることにした。WebサーバはIISのまま(本当はApacheの方が実例も多いし良いのだろうが、私の関わった顧客のサーバはIISばかりなのだ)静的なコンテンツをサービングし、Railsアプリケーションの実行にはFastCGI-Rubyではなく、その道では著名なMongrelを使うことにした。

Mongrel - Mongrel is a fast HTTP library and server for Ruby

Mongrelアプリケーションサーバに仕立ててWebサーバと連携させる場合、MongrelへのリバースプロキシとしてWebサーバを設定する必要がある。Apacheではそのためのmod_proxyがあるので、これと組み合わせるのが常道らしいが、IISも標題のモジュールを組み込むことで同様のことを実現できる。(本当は以前、FastCGIによるホスティングのエントリを書いた時に紹介したURL Rewriter Moduleさえあれば良いのだが、それに関しては後述する)

Using the Application Request Routing Module Installing and Configuring IIS 7.0 - The Official Microsoft IIS Site

このモジュールをインストールすると、IISマネジャのホームにProxyのアイコンが追加される。

リバースプロキシの設定だけであれば使い方は簡単で、上記のアイコンを開きリバースしたいホスト名+ポートを指定するだけである。(上方に見えているが、プロキシのチェーンも構成できるようだ)

これでOK。全てのリクエストはMongrelの待ち受けるポート3000を経由するようになる。

このスクリーンショットでは解らないが、プロキシ機能は、実はURL Rewrite Module により実装されており、実際にサイトに対するURL書換ルールとして登録される。

このスクリーンショットはサイトから"URL Rewrite"アイコンを開いた状態だが、先ほど行ったリバースプロキシの設定がルール"ARR_server_proxy"という名前で登録されているのが解る。

ということは、リバースプロキシ目的として本機能を導入したが、実際にはURL Rewrite Module が導入されていればリバースプロキシは実現できることになる。

ということでRailsアプリケーションを展開したサイトに対して、同様にリバースプロキシ用のルールを設定してみた。

問題無くRailsアプリケーションをIIS経由で動かすことができている。

実は、またもやスタイルシートの読込みに失敗しているのだが、この点に関しては次のネタにする。

IISMongrelによるRailsアプリケーションのホスティングはFasrCGI経由にように不安定な物ではなく(単にMongrelが動作しているのは変わらないので当たり前だが)非常に速く動作するので、これなら十分に使えそうだ。

先日Rails 2.3のリリース候補版がリリースされたが、RackがついにCGIに取って代わった等、その変更点を見ても、今後FastCGIに固執する意味はあまり無いと思われる。
Ruby on Rails 2.3 Release Notes

Application Request Routing Moduleを導入することによって実現される機能はリバースプロキシの機能だけではないのだが、今回はそれ以外に関しては割愛する。
※閲覧にはwww.iis.netに登録が必要