at posts/single.html

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割くらい速くなった。

指標CGIFastCGI
1リクエストの応答時間(msec)1632906
1秒あたりの処理数0.611.10

安定度は不明。しばらくつかってみて、様子をみるかな。

関連する日記