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は、WindowsのHTTP.SYSを利用することで、複数のプロセスに同一HTTPポートを割り当てることと、HTTPのプロトコル処理をサービスに実行させることで、複数プロセスへのリクエスト割り当てによる並行性の向上と、プロトコル解析のオーバーヘッドの低減を狙ったRack用Webサーバ(HTTP.SYSラッパー)です。
どのくらい高速かというと、1プロセスでWEBrickの20倍以上、3プロセスで50倍程度です。単なるindex.htmlの応答であればRailsを通しても秒あたり1プロセスで600リクエスト程度は処理しました(このへんはネットワークの太さやマシンスペックに依存するので目安ということで)。ただし、各プロセス、最初のリクエストはRailsの初期化が走るからだと思いますが、普通に時間がかかります。
本プログラムは、LGPLなので、再配布などは完全に自由ですが、ソースを修正した場合は公開してください。
インストールは、http://www.artonx.org/data/nougakudo/から、NougakuDo のリンクを利用してダウンロード、実行してください。
実行すると、選択項目はなく、「Next」のクリックで終了します。
インストーラは自動的にユーザのRoamingディレクトリへインストールします。
このディレクトリは通常、\Users\ユーザ名\AppData\Roaming
です。ユーザ自身の所有ディレクトリなので、ユーザは書き込み権限を持ちます。このため、Gemを利用したインストールなどは問題なく実行できます。
ただし、うかつにファイルを削除するとMSIの監視機能により再インストールが走るので注意してください。
インストールすると、スタートメニューに、以下の3つのアイコンが登録されます。
NougakuDoアイコンを実行すると、最初に管理者権限への昇格を求められます。
これは、HTTP.SYSを利用するのに管理者権限が必要だからです(※)。
netsh http add urlacl url=http://{仮想ホスト名 | +}:80/{ディレクトリ名} user={グループ名|ユーザ名|ドメイン\ユーザ名}
次に、HTMLアプリケーションが動き出します。「select your config.ru:」に対して、RailsアプリケーションのRack設定ファイル(通常、config.ru
)を指定してください。
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を起動して「アプリケーション名\アプリケーション名」を実行してください。
SQLServer Expressをインストールしている場合は、以下の手順でSQLServer Expressをデータベースとして利用できます。
rails new app
でプロジェクトを生成したら、その状態でtds_setup app
をコマンドプロンプトで実行します。これでsqlserver-adapterを利用するための準備ができるため、後はconfig/database.ymlのユーザ名やデータベース名などを修正するだけです。
tds_setupコマンドは以下の処理を実行するバッチファイルです。
gem 'activerecord-sqlserver-adapter'
gem 'sqlite3'
の置き換えが良いでしょう。
development: adapter: sqlserver username: コンピュータ名\ユーザ名 password: ユーザのパスワード dataserver: localhost\SQLEXPRESS database: データベース名 pool: 5 timeout: 5000
azure: true
を設定してください(未テスト)。SQL Server(Standard Edition以上)を利用する場合は、幾つかの考慮点があります。
development: adapter: sqlserver username: コンピュータ名\ユーザ名 password: ユーザのパスワード dataserver: データベースサーバのコンピュータ名 database: データベース名 pool: 5 timeout: 5000
演能は、仮想ホストではなくディレクトリによってアプリケーションを分離します。それに対してRailsは仮想ホストによるアプリケーション分離を前提としているため、既定で作成するcssやJavaScriptのパスは/
から始まります。
このため、もしホスト上で実行しているすべてのアプリケーションのCSSやJavaScriptが共通であれば、IISの仮想ディレクトリとして/javascripts
や/stylesheets
を用意することで、これらのアセットをRailsの介在なしに処理できます。
そうではなく、アセットをアプリケーション単位に提供したい場合には、
config/environment.rb
の先頭にRAILS_RELATIVE_URL_ROOT
を設定します。これにより、サブディレクトリモードと仮想ホストモードで設定を変更しなくても利用できます。
重要!: productionモードでアセットを演能に処理させるには、config/environments/production.rb
のconfig.serve_static_assets
をtrue
に設定してください。
既定ではこの変数はfalse
に設定されています。
config/application.rb
で、アプリケーション名(演能が認識しているURIのディレクトリ名)をアセットのURIに追加してください。
config.action_controller.asset_path = '/アプリケーション名/%s'このように設定することで、Railsが生成するアセットのURIは
/アプリケーション名/javascripts/rails.js
などのアプリケーション名が先頭に付加された形式となります。これによってアセットも演能によって処理されるようになります。
Rails 3.1.1が利用するJavaScriptコンパイラのuglifier-1.0.4とJScriptの組み合わせは、rake assets:precompile
でTypeErrorが発生します。これを避けるには次のいずれかを利用してください。
config.assets.compress = false
を設定する(既定はtrue)。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を利用してください。
Rails3はまずここから。
読みやすく利用しやすい達人出版会の電子書籍もどうぞ!
達人出版会の「はじめる! Rails3 (1)」
達人出版会の「はじめる! Rails3 (2)」