Rack ベースの Web アプリを IIS で動かしてみました
前回にご紹介した Railsカンファレンスの IronRuby on Railsセッションで、Rails以外のWebフレームワークとしてrackが紹介されていました。rackは、Ruby向けの Webインターフェースを提供するフレームワークで、Ruby on Rails 2.3.x系も内部でrackと統合されています。このrackをIronRubyを使って、IISで動かしてみました。その動かし方を以下に記載します。
1.必要なもの
- IronRuby 0.5.0
- rack 1.0.0
- IronRuby.Rack
- Ruby 1.8系
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サーバーには対応していません。