サーバが速くなったから、CGI運用でいいんじゃない?と思ったのですが、やっぱり遅いので、FastCGIでの運用に変更しました。
もともと移転前はRuby-1.8+FastCGIで、こんな感じで運用していました。
~/users/aaa/index.fcgi -> ~/tdiary-core/index.fcgi ~/users/aaa/index.rb -> ~/tdiary-core/index.rb ~/users/aaa/tdiary.conf ~/users/aaa/update.rb -> ~/tdiary-core/update.rb
これで、プロセス上は~/users/aaa/index.fcgiが動きながら、bbb.tdiary.netへのアクセスもさばいていたはずなのですが、同じ設定で今回動かしてみると、bbb.tdiary.netにアクセスがあると、~/users/aaa/index.fcgiが動いていても、新たに~/users/bbb/index.fcgiが起動してしまいました。
現在、第二tDiary.Netでは、106個の日記が動いているので、この調子でつぎつぎプロセスができてしまっては困ります。そこで、すべてのアクセスを単一のFastCGIスクリプトでさばくように、mod_rewriteのルールを変更しました。
RewriteRule ^[^.]+\.tdiary\.net/([0-9\-]+)\.html$ /home/tdiary/tdiary/tdiary-core/index-multi.fcgi?date=$1 [L] RewriteRule ^[^.]+\.tdiary\.net/$ /home/tdiary/tdiary/tdiary-core/index-multi.fcgi [L]
そして、FastCGIスクリプトはこんな感じ。
$ diff -u index.fcgi index-multi.fcgi --- index.fcgi 2011-09-18 09:58:31.000000000 +0200 +++ index-multi.fcgi 2011-09-18 16:50:45.000000000 +0200 @@ -26,7 +26,8 @@ class << CGI; self; end.class_eval do define_method(:new) {|*args| cgi } end - dir = File::dirname( cgi.env_table["SCRIPT_FILENAME"] ) + dir = "/home/tdiary/users/#{cgi.env_table['SERVER_NAME'].sub(/\.tdiary\.net/, '')}" + $PROGRAM_NAME = "#{dir}/index.rb" Dir.chdir(dir) do load 'index.rb' end
psで見えるプロセス名は、アクセスのたびにターゲットとなる日記に応じた$PROGRAM_NAMEに設定された/home/users/aaa/index.rbみたいなプロセスになりますが、pidは変化せずに同じプロセスが常駐しながら、複数の日記へのアクセスをちゃんとさばくようになりました。 もちろん、同時に複数のアクセスがあった場合は、(mod_fcgidのMaxProcessCountの値の範囲内で)別のプロセスが起動します。
これで、プロセス数やメモリの使用量を抑えつつ、高速に複数の日記を運用することができました。