サーバが速くなったから、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の値の範囲内で)別のプロセスが起動します。
これで、プロセス数やメモリの使用量を抑えつつ、高速に複数の日記を運用することができました。