tDiary を ruby1.9 + apache + fcgi で動かしてみた
前回はtDiary を ruby1.9 + nginx + fcgi で動かしてみたんだけど、以下の理由から実用には厳しいと判断。
理由1: プロセスの生成・管理の仕組みがない
nginx は FastCGI プロセスを起動する仕組みを持たない。 spawn-fcgi などを使って、 Web サーバのプロセスとは別に FastCGI のプロセスを起動しておく。 さらに FastCGI プロセスが異常終了することを考えると、プロセスの監視・再起動を自動化する仕組みも必要になる。 spawn-fcgi の -P オプションを使って FastCGI プロセスの PID をファイルに書き出しておいて、monit などの自動監視ツールを使えばいいんだろうけど、スクリプト単位でここまでやるのは面倒。
$ spawn-fcgi -p 10000 -P /var/run/tdiary.pid -u nobody -f /path/to/index.fcgi
理由2: URL単位の設定ファイルの記述が上書きされない
これは僕の理解が悪いのかもしれないけど。 以下のように設定を書いた場合に、 /diary/index.fcgi のアクセスがあると設定1と設定2の両方が反映されて欲しい。
location ~ \.fcgi$ { # 設定1 } location /diary/ { # 設定2 }
でも、どうやら先にマッチしたほうの設定だけが有効になっているみたい。
理由3: CGIを実行できない
nginxはFastCGIは実行できるけどCGIは実行できない。 CGIを実行するためには、FcgiWrapなどを使ってFastCGI経由でCGIを起動する仕組みが必要。 こうなるとFastCGIプロセスの管理が必要になるし、たくさんのCGIを動かす場合には、FcgiWrapがボトルネックになりそう。
結局 Apache + mod_fcgid を使うことにした
Nginx はシンプルだし特定用途に使うには向いていると思う。 でも、個人のサーバで汎用的に使うには、まだまだ機能が足りない感じ。 フロントに Nginx をおいて静的ファイルを処理させて、リバースプロキシで Apache や Thin などに繋ぐ構成がいいのかな。 という訳で、tDiaryのFastCGIを起動するためにNginxを使うのはやめた。
まず、mod_fcgidをインストール。以下、CentOSの場合。
$ sudo yum install mod_fcgid
以下の内容で/etc/httpd/conf.d/fcgid.confが生成される。
LoadModule fcgid_module modules/mod_fcgid.so <IfModule !mod_fastcgi.c> AddHandler fcgid-script fcg fcgi fpl </IfModule> SocketPath run/mod_fcgid SharememPath run/mod_fcgid/fcgid_shm
AddHandlerでfcgi拡張子がFastCGIスクリプトとして判定されるようになる。 あとは、httpd.confからincludeすればOK。(debian系の場合はシンボリックリンクを使う)
include conf.d/fcgid.conf
設定はこれだけ。 プロセスの起動・管理も mod_fcgid が担当してくれる。 UNIXソケットを使っていて、ソケットは /var/run/mod_fcgid ディレクトリに生成しているみたい。 Webブラウザからリクエストを送ると Apache が FastCGI プロセスを生成し、一定期間が経つと自動的に削除される。
プロセスの生成数や削除までの時間は設定で変えられる。 サーバのメモリ量と相談して決めること。 詳しくは mod_fcgidのドキュメントのProcess Managementを参照。
最後に、tDiaryを設置したディレクトリにある .htaccess を編集して完了。
RewriteEngine on RewriteBase /diary/ RewriteCond %{HTTP_HOST} ^(machu\.jp)(:80)? RewriteRule ^(.*) http://www.machu.jp/diary/$1 [R=301,L] RewriteRule ^([0-9\-]+)\.html$ index.fcgi?date=$1 DirectoryIndex index.fcgi (以下省略)
パフォーマンス
abコマンドを使ってCGIとFastCGIの場合で測定。 FastCGI化によって、4割くらい速くなった。
指標 | CGI | FastCGI |
1リクエストの応答時間(msec) | 1632 | 906 |
1秒あたりの処理数 | 0.61 | 1.10 |
安定度は不明。しばらくつかってみて、様子をみるかな。