トップ «前の日記(2005-07-22 (Fri)) 最新 次の日記(2005-08-02 (Tue))» 編集   RSS 1.0 FEED  

Journal InTime


2005-08-01 (Mon) [長年日記]

_ [mod_ruby][Rails] 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サーバに処理させるよね?

*1  もちろん冗談ですよ

*2  FastCGIでもフレームワークの作り方によって違う形にもできるとは思う。

_ [ximapd] やまださんのパッチ

たくさんのパッチをいただいたのでマージ。 ありがたいことです。

自分もちゃんとコード書かないとな。 とりあえず、もうちょっと速くしただけどなかなか大変そう。 fetchの上限を作っちゃうのが一番てっとりばやいかな。 古いメールは検索して読め、と。

本日のツッコミ(全2件) [ツッコミを入れる]
_ はんばあぐ (2005-08-22 (Mon) 13:21)

素晴らしい>mod_ruby

_ shugo (2005-08-22 (Mon) 15:18)

ありがとうございます。<br>(あんまり反応がなかったのですっかり忘れてました:()