Rack ベースの Web アプリを IIS で動かしてみました

前回にご紹介した Railsカンファレンスの IronRuby on Railsセッションで、Rails以外のWebフレームワークとしてrackが紹介されていました。rackは、Ruby向けの Webインターフェースを提供するフレームワークで、Ruby on Rails 2.3.x系も内部でrackと統合されています。このrackをIronRubyを使って、IISで動かしてみました。その動かし方を以下に記載します。

1.必要なもの

2.rackのインストール

  • 「igem install rack」コマンドでインストールします。
    私の場合は、PATHとGEM_PATH環境変数を設定後に実行しました。実行すると以下のようなメッセージが出力されます。

     C:>igem install rack
    Successfully installed rack-1.0.0
    1 gem installed
    Installing ri documentation for rack-1.0.0...
    Installing RDoc documentation for rack-1.0.0...
    mscorlib:0:in `GetBytes': 値が有効な範囲にありません。
                  (System::Text::EncoderFallbackException)
            from :0:in `write'
            from :0:in `puts'
            from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/
                 user_interaction.rb:227:in`alert_error'
            from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/
                 user_interaction.rb:103:in`alert_error'
            from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/
                 command_manager.rb:77:in `run'
            from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/
                 gem_runner.rb:39:in `run'
            from C:/IronRuby0.5.0/bin/igem:24
    

    このエラーはIronRubyのバグのようで、riとrdocのインストールに問題があることを示しています。このエラーを発生させないためには、--no-ri --no-rdocオプションでriとrdocをインストールしない方法があります。
    インストールが終了すると、IronRuby 0.5.0のライブラリパスへとrackがインストールされます。

3.HTTPハンドラをビルドします

  • githubからダウンロードしたIronRuby.Rackをビルドします。
  • 私の場合は、以下のような手順で作業を行いました。
    git clone git://github.com/jschementi/ironruby.git
    コピーしたソースコードの中から、C:\Users\shozoa\wk\ironruby\Merlin\Main\Hosts\IronRuby.Rackフォルダを作業用フォルダへコピー。
    IronRuby.Rack.slnファイルをVisual Studioで開いて、IronRuby.RackプロジェクトとIronRuby.Rack.Exampleプロジェクト以外のプロジェクトを削除(環境によって、IronRuby.Rack.Exampleプロジェクトは無効になっているかも知れません)
    IronRuby 0.5.0の7つのアセンブリに対して参照をIronRuby.Rackプロジェクトへ追加しました。
    これでIronRuby.Rackプロジェクトをビルドできるようになりました。

4.IISの環境を作成します

  • 管理ツールのIISマネージャを開きます。

  • Default Web Sitesの下へ新規のアプリケーションを作成します。
    エイリアスを「IronRuby.Rack.Example」にします。
    物理パスにコピーしたソースコードの「IronRuby.Rack\IronRuby.Rack.Example」を指定します。

  • IronRuby.Rack.Example\web.config の configセクションを編集します。

     <section name='microsoft.scripting'
    type='Microsoft.Scripting.Hosting.Configuration.Section,
    Microsoft.Scripting, Version=0.9.6.10, Culture=neutral,
    PublicKeyToken=31bf3856ad364e35'
    requirePermission='false' />
    

    この変更は、アセンブリのバージョン番号とパブリックキートークンが異なるために行っています。

  • Visual Studio で IISのWebプロジェクトを編集するには、IISにいくつかのオプションが必要になります。このオプションとは、Windowsの機能のことです。追加されるには、アプリケーションの追加で以下の機能を追加します。
    セキュリティ-要求フィルタリング、Windows認証
    管理ツール-IIS6と互換性のある管理-IISメタベースとIIS6構成との互換性
    管理ツール-IIS管理コンソール、IIS管理サービス、IIS管理スクリプトとツール
    (注)Visual Studio 2008で編集しないのであれば、この作業は必要はありません。私は、IIS7で動作確認を行っています。

  • IronRuby.Rack.Example\Binフォルダへ必要なアセンブリを配置します。
    IronRuby.Rackプロジェクトでビルドして出来たアセンブリ(私の場合Debug\Binフォルダにある8つ)をコピーしました。

  • RubyとIronRubyのライブラリに対して、IISを起動するアカウント(Network Service)に対してアクセス権限を付与します。
    「C:Ruby」と「C:\IronRuby-0.5.0」へ読み取り権限を私は付与しました。

5.ブラウザでテストします

  • 「https://localhost/IronRuby.Rack.Example」へアクセスします。

     IronRuby running Rack says "Hello, World"
     at 木 6 11 16:22:32 +09:00 20
    
  • 上記のように表示されれば成功です。この表示は、IronRuby.Rack.Example\app.rbに記述されたスクリプトを実行して出力しています。config.ru(rackの構成ファイル)などをカスタマイズすれば、別のアプリケーションへURLをマップしたりすることもできます。

6.IronRuby.Rackの制限事項

  • GEM_PATH環境変数が「C:\ruby\lib\ruby\gems\1.8」固定になっている(Application.cs)ため、ruby 1.8系のインストールフォルダが「c:\ruby」で無ければならないということです。
  • rackの構成ファイルが、Webアプリケーションのルート直下に無ければならない
  • 制限ではないですが、HTTPハンドラは内部でRackupを行っています。
    (注)この個所を応用すれば、別のフレームワークもサポートできるかも知れません。
  • Visual Studioの開発用Webサーバーには対応していません。