2011-09-18 [長年日記]

_ [tDiary] 第二tDiary.NetをFastCGI化

サーバが速くなったから、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の値の範囲内で)別のプロセスが起動します。

これで、プロセス数やメモリの使用量を抑えつつ、高速に複数の日記を運用することができました。


トップ «前の日記(2011-08-29) 最新