能楽堂

64ビットWindows用のRails環境NougakuDo(能楽堂)を作ったのでリリースします。私が配布しているASRやRuby-1.9.2でRailsを利用するのであれば、こちらを利用した方が、あらゆる点(インストールの簡便さ、実行速度、利用可能なメモリ量=スレッド数)でお得です。
特に、Windowsの特徴であるHttp.sysの機能を相当引き出しているつもりなので、Windows用実行環境としては、マルチプロセスでの実行の簡単さや、速度面では最も優れていると思います。

特徴

能楽堂には以下の特徴があります。

つまり、WindowsでのRailsの開発、WindowsとWindows Azureでの実行を1つのパッケージでまかなうことを目的とした簡単導入ツールです。

サポートプラットフォーム

条件は、X64版Windowsであることと、HTTP API 2.0をサポートしていることです。

Ennou(演能)

Ennouは、WindowsのHTTP.SYSを利用することで、複数のプロセスに同一HTTPポートを割り当てることと、HTTPのプロトコル処理をサービスに実行させることで、複数プロセスへのリクエスト割り当てによる並行性の向上と、プロトコル解析のオーバーヘッドの低減を狙ったRack用Webサーバ(HTTP.SYSラッパー)です。

どのくらい高速かというと、1プロセスでWEBrickの20倍以上、3プロセスで50倍程度です。単なるindex.htmlの応答であればRailsを通しても秒あたり1プロセスで600リクエスト程度は処理しました(このへんはネットワークの太さやマシンスペックに依存するので目安ということで)。ただし、各プロセス、最初のリクエストはRailsの初期化が走るからだと思いますが、普通に時間がかかります。

本プログラムは、LGPLなので、再配布などは完全に自由ですが、ソースを修正した場合は公開してください。

インストール方法

install window

インストールは、http://www.artonx.org/data/nougakudo/から、NougakuDo のリンクを利用してダウンロード、実行してください。

実行すると、選択項目はなく、「Next」のクリックで終了します。

インストール先

インストーラは自動的にユーザのRoamingディレクトリへインストールします。

このディレクトリは通常、\Users\ユーザ名\AppData\Roamingです。ユーザ自身の所有ディレクトリなので、ユーザは書き込み権限を持ちます。このため、Gemを利用したインストールなどは問題なく実行できます。

ただし、うかつにファイルを削除するとMSIの監視機能により再インストールが走るので注意してください。

使い方

start menu

インストールすると、スタートメニューに、以下の3つのアイコンが登録されます。

NougakuDoの使い方

nougakudo

NougakuDoアイコンを実行すると、最初に管理者権限への昇格を求められます。

これは、HTTP.SYSを利用するのに管理者権限が必要だからです(※)。

次に、HTMLアプリケーションが動き出します。「select your config.ru:」に対して、RailsアプリケーションのRack設定ファイル(通常、config.ru)を指定してください。

nougakudo

Rack設定ファイルが選択されると、NougakuDoは指定されたファイルを読み込んでアプリケーション名などの実行に必要な情報を取得します。

NougakuDoは情報を確認すると、次に実行に必要なパラメータをリスト表示します。

Railsアプリケーションを起動するには、デバッグの有無などのオプションやプロセス数を設定してから、Launchボタンをクリックします。

なお、アプリケーションのURIは、http://ホスト名:80/アプリケーション名/ となります。

能楽堂は、仮想ホスト名ではなく、トップディレクトリでアプリケーションを分けることを本則とします。このとき、アプリケーション名には、Railsコマンドで作成したアプリケーション名が利用されます。これは、Config.ruのrunコマンドから読み取ります。

Launchボタンをクリックして起動に成功すると、黒いコマンドプロンプトが表示されます。

NougakuDoから実行したRailsアプリケーションは、1プロセスの場合も、複数プロセスの場合も、1つのコンソールを共用します。

アプリケーションを終了するには、Ctrl-Cを打ち込んでください。

なお、同時に同一アプリケーションを複数起動することはできません。HTTP.SYSによってURI競合としてエラーとなります。

異なるアプリケーションを起動することは可能ですが、能楽堂 1.0.x ではサポートしていません。この機能は、1.1以降でサポートする予定です。

Save Configボタンをクリックすると、configを選択したすべてのアプリケーションディレクトリのconfig.ruを設定内容で更新します。また、「アプリケーション名.bat」というファイルをアプリケーションディレクトリへ生成します。このバッチファイルは、Promptからの起動用です。

能楽堂を利用しない実行

NougakuDoを利用せずに、演能をWebサーバとしてRailsアプリケーションを実行するには、スタートメニューでPromptを右クリックしてコンテキストメニューを表示し、『管理者として実行』を選択して管理者権限で実行してください。WEBrickを利用する場合は管理者権限は不要です。

次に、開いたコマンドプロンプトで、 rackupを利用します。

最初にcdコマンドを利用してアプリケーションのルートディレクトリへ入り、次に、rackupを実行します。

この時、 演能を利用する場合は、

と入力します。

マルチプロセスの場合、プロセス数の指定はconfig.ruで行います。

指定方法は、config.ruのrunメソッド呼び出しの直前の行で、

require 'rack/handler/ennoumu'
Rack::Handler::Ennoumu.config :nprocs => 4 # 既定は2 。この例では4

のようにEnnoumu(マルチプロセス版演能のクラス名です)のconfigメソッドにハッシュで与えます。

なお、能楽堂のSave Configを実行することで、上記を自動化したアプリケーション起動用バッチファイルを生成します。これを利用する場合は、Promptを起動して「アプリケーション名\アプリケーション名」を実行してください。

tiny_tdsの利用方法

SQLServer Expressをインストールしている場合は、以下の手順でSQLServer Expressをデータベースとして利用できます。

rails new appでプロジェクトを生成したら、その状態でtds_setup appをコマンドプロンプトで実行します。これでsqlserver-adapterを利用するための準備ができるため、後はconfig/database.ymlのユーザ名やデータベース名などを修正するだけです。

tds_setupコマンドは以下の処理を実行するバッチファイルです。

SQL Server(Standard Edition以上)を利用する場合は、幾つかの考慮点があります。

assetのpath設定について

演能は、仮想ホストではなくディレクトリによってアプリケーションを分離します。それに対してRailsは仮想ホストによるアプリケーション分離を前提としているため、既定で作成するcssやJavaScriptのパスは/から始まります。

このため、もしホスト上で実行しているすべてのアプリケーションのCSSやJavaScriptが共通であれば、IISの仮想ディレクトリとして/javascripts/stylesheetsを用意することで、これらのアセットをRailsの介在なしに処理できます。

そうではなく、アセットをアプリケーション単位に提供したい場合には、

  1. 能楽堂 1.1.xでは自動的にconfig/environment.rbの先頭にRAILS_RELATIVE_URL_ROOTを設定します。これにより、サブディレクトリモードと仮想ホストモードで設定を変更しなくても利用できます。

    重要!: productionモードでアセットを演能に処理させるには、
    config/environments/production.rbconfig.serve_static_assetstrueに設定してください。
    既定ではこの変数はfalseに設定されています。

  2. 能楽堂 1.0.xでは以下のようにconfig/application.rbで、アプリケーション名(演能が認識しているURIのディレクトリ名)をアセットのURIに追加してください。
        config.action_controller.asset_path = '/アプリケーション名/%s'
      
    このように設定することで、Railsが生成するアセットのURIは/アプリケーション名/javascripts/rails.jsなどのアプリケーション名が先頭に付加された形式となります。これによってアセットも演能によって処理されるようになります。

能楽堂 1.1.8以降(Rails 3.1.1)のassets:precompileについて

Rails 3.1.1が利用するJavaScriptコンパイラのuglifier-1.0.4とJScriptの組み合わせは、rake assets:precompileでTypeErrorが発生します。これを避けるには次のいずれかを利用してください。

  1. config/environemnts/production.rbで、JavaScriptの圧縮指定を解除。
    config.assets.compress = falseを設定する(既定はtrue)。
  2. uglifierのかわりにclosure-compilerを利用。
    能楽堂にはあらかじめclosure-compilerと、設定をuglifierからclosure-compilerへ変更するuse_closureコマンドを用意してあります。
    なおclosure-compilerを利用するにはPATHにJavaが登録されている必要があります。
    use_closureコマンドを実行すると、引数で指定したディレクトリのGemfileおよびconfig/environments/production.rbに必要な設定を行います。

問題点(あるいは制限事項)

WebアプリケーションがGVLを解除せずに同期的に外部リソース(RDBなど)を呼び出すスレッドが存在するとそのプロセスは止まります。

このような外部リソースを利用するアプリケーションはプロセス数を増やして実行してください。

その他

Ennouに関する質問や要望、バグ報告については https://github.com/arton/ennouのIssuesを利用してください。

その他のことについては、rails ML(rails@ruby.ml.fdiary.net)で質問してください。能楽堂に対する質問のつもり でも、実際はRailsについての質問という可能性があるからです。また、1人が持つ疑問は30人が持つものです。できるだけ知識を共有するためにも、MLを利用してください。

参考書

WEB+DB PRESS Vol.58(編/WEB+DB PRESS編集部)

Rails3はまずここから。

読みやすく利用しやすい達人出版会の電子書籍もどうぞ!
達人出版会の「はじめる! Rails3 (1)」
達人出版会の「はじめる! Rails3 (2)」