sinatraアプリなどをapache/passenger/mod_railsで動かす

passengerをインストールして、使うためのコマンド実行。

% sudo gem install passenger
% sudo passenger-install-apache2-module

最後にこんなメッセージ。

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3/ext/apache2/mod_passenger.so
   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.3
   PassengerRuby /usr/bin/ruby

表示されるパスは環境により異なるはず。まぁ、言われる通りに上記をapacheのconfにコピペ。


あとはアプリケーションルートに public tmp のディレクトリを作成、 config.ru を以下の内容で作成。

require 'start' # sinatraアプリの名前を指定
run Sinatra::Application

あとはapacheのconfに以下を追記。

<VirtualHost *:80>
    DocumentRoot "/path/to/sinatra_app/public"
</VirtualHost>

あとはapache再起動して終わり。
簡単過ぎて泣ける。 perl/apache/mod_perl/catalyst のときはあんなに苦労して調べたのに。


まあこれで終わりでもいいのだけど、やっぱり静的コンテンツ/動的コンテンツでapacheは分けるべきかと。
アクセスログ見たら、cssもjpgもsinatraアプリも全部同じapacheプロセス(mod_railsをロードした、メモリ食いな)が処理してたし。apacheプロセス1個だけだから当然だけど。
passengerは自動でいい感じに処理してくれるとかだったらごめん。確かtomcatだかstrutsは、何も意識しなくても処理してくれるらしいから、passengerもそうなってますよとか。
とりあえず、catalystのときとは異なり、本当にmod_railsをロードしているかいないかの違いしかないconfを2つ用意していい感じに出来た。多分、無駄があるけど、mod_railsに静的コンテンツを処理させるよりは遥かにマシなはず。
静的だの動的だの何それおいしいのって人は つ http://d.hatena.ne.jp/foosin/20090502/1241274828


あと、アプリを再起動したい場合は、apacheを再起動するまでも無く、 tmp ディレクトリ以下に restart.txt を置けばいい。その次のリクエスト時に自動で再起動してくれる。
再起動後、restart.txtは削除されるらしいのだけど、うちでは何度試してもされなかった。apacheが読み書きできる権限なのに。ただ、タイムスタンプを見てるっぽく、最初の1回しかアプリは再起動しない。touchなどすればまた再起動される。
開発中で毎回再起動したいーっていう場合は、 restart.txt の代わりに always_restart.txt というファイルを置けばよろしい。

参考リンク

Sinatraで鼻歌まじりのWeb開発
http://www.modrails.com/documentation/Users%20guide%20Nginx.html (特に 7.6. Making the application restart after each request の項)