2005-08-01 (Mon) [長年日記]
_ Apache::RailsDispatcher
Agile Web Development with Railsでdeprecated approachと書かれている のに腹が立って*1実装。
<URL:http://svn.modruby.net/repos/mod_ruby/trunk/lib/apache/rails-dispatcher.rb>
(mod_ruby自体も最新にしないと動かないので注意。)
RubySafeLevel 0 # RubyGemを使う場合 # RubyRequire rubygems RubyRequire apache/rails-dispatcher RubyTransHandler Apache::RailsDispatcher.instance <Location /appname> SetHandler ruby-object RubyHandler Apache::RailsDispatcher.instance RubyOption rails_uri_root /appname RubyOption rails_root /path/to/rails/root RubyOption rails_env development </Location>
こんな感じの設定で動くと思う。
以下の方針により、複数アプリケーションを動かすことができるようにした。
- requireしたものはすべてのアプリケーションで共有。
- require_dependencyしたものはアプリケーションごとの無名モジュールにロード。 (load(filename, true)相当)
- development環境では無名モジュールを毎回破棄。
- production環境では無名モジュールを使い回す。
- Railsの設定(RAILS_ROOTやActiveRecord::Base.colorize_logginなど)は 毎回リセット。
- 本当はDBのコネクションプールを実装したいけど、まだやってない。
まあ、YARVのMulti VMサポートまでのつなぎだけど。
単一のアプリケーションだけ動かすようなケースでは、今のところlighttpd + FastCGIが一番パフォーマンスがよいが、 FastCGIだとアプリケーション数に比例してプロセス数が増える *2 のが気になるところ。 いっぱいアプリケーションを動かすような場合には、インタプリタや フレームワーク部分を共有するmod_rubyの方がおトクかもしれません。
あと、Rails本では「FastCGIなら100プロセスのWebサーバで静的な ファイルを処理しつつ、FastCGIのプロセス数は10におさえることで メモリ消費を抑えられるけど、mod_rubyだとでかいプロセスが100コ になっちゃうよん」みたいなことが書いてあるけど、mod_rubyでも mod_perlでもふつーそういう時には静的ファイルは別のApache インスタンスなり他のWebサーバに処理させるよね?
_ やまださんのパッチ
たくさんのパッチをいただいたのでマージ。 ありがたいことです。
自分もちゃんとコード書かないとな。 とりあえず、もうちょっと速くしただけどなかなか大変そう。 fetchの上限を作っちゃうのが一番てっとりばやいかな。 古いメールは検索して読め、と。
素晴らしい>mod_ruby
ありがとうございます。<br>(あんまり反応がなかったのですっかり忘れてました:()