現在、玄箱のHTTPデーモンとしてApache2をインストールしている。
世間一般で使われているApache1.3ではなくてApache2を入れている理由は、Subversionを使用する為である。
Apache2の場合、Perlの高速化にはmod_perlではなく、mod_perl2を使うことになるが、mod_perlとmod_perl2ではインターフェースが大きく違っており、mod_perl2でMovableTypeを使用できるようにするにはかなり大幅な変更が必要となる。その為、前回は高速化を断念した。
今回、mod_perlと違うアプローチとして、FastCGIを使う方法でMovableTypeの高速化に成功したので、メモとして残しておこうと思う。
参考にしたサイトは、MT 3.2 on Apache + FastCGI - OgawaMemorandaで、注意する部分だけを記述する。
ちなみに私は3点分からなくて長時間ハマってしまった。
Apache2がインストールされ、MovableTypeが既に動作しているとして、次に行わなければならないのが、FastCGIのインストール。
Debianの現在の安定版(stable)ディストリビューションはsargeになるが、まず注意しなければならないことは、Debianディストリビューションのmainセクションでパッケージ化されているのはFastCGIではなくfcgidである。この2つは別物である。これがわからずに数時間ハマった。
FastCGIはnon-freeセクションになるので、/etc/apt/sources.listに、
deb ftp://ftp.dti.ad.jp/pub/Linux/debian sarge main contrib non-free
のようにnon-freeを付け足し、あとはrootになるかsudoでaptitude update後、aptitude install libapache2-mod-fastcgi を実行してインストールする。
次に、MT 3.2 on Apache + FastCGI - OgawaMemorandaの0から、6までのステップを参考に設定を行う。
ステップ0: Movable TypeにUnofficial Patchをあてる。
MT 3.2日本語版 Release 2の非公式パッチ。FastCGIなどの常駐環境に関わる修正が入っているのであてておく。
パッチをあてた後、
mt.cgi、mt-comments.cgi、mt-tb.cgi、mt-search.cgi
を、それぞれ
mt.fcgi、mt-comments.fcgi、mt-tb.fcgi、mt-search.fcgi
にリネームするか、コピーするか、リンクするかの何れかをしておく。
ステップ1: httpd.confを設定する。
これは、DebianのApache2の場合は、/etc/apache2/mods-availableにあるfastcgi.loadとfastcgi.confへのシンボリックリンクを、/etc/apache2/mods-enabled/に追加しておけばよい。
# ln -s /etc/apache2/mods-available/fastcgi.* /etc/apache2/mods-enabled/
ステップ2: dispatch.fcgiを用意する。
そのままコピペで、dispatch.fcgiを作り、mt.cgi等があるMovableTypeの設置先と同じフォルダに入れる。実行パーミッションの設定を忘れずに。
このスクリプトは何を行っているか簡単に説明すると、FastCGIの動作原理はプロセスを起動後、一定期間終了せずに立ち上げた状態にしておき、次のCGIの実行の要求があったときに、起動した状態のスクリプトに再度実行させることにより、プロセスの起動と終了というCGIの実行で負荷の高い処理を省くことにより高速化を行っている。
スクリプトの中にwhile 文があり、判定式の中で、my $q = new CGI::Fastと行っているが、この部分がdispatch.fcgiに割り当てられたリクエストを受け取る部分である。
受け取ったリクエストのurlのファイル名を解釈し、適切なクラスのインスタンスを生成して実行し、終了したらまたリクエストを待つ。という動作を繰り返し行っている。
ちなみにこの動作を行うには、mt.fcgiや、mt-tb.fcgiがリクエストされた場合に、これらを実行する代わりに、dispatch.fcgiを実行するという変換を行う必要がある。
それが次のステップ3で行っている部分である。
ステップ3: RewriteRuleを設定する。
ここは何をしているかというと、FastCGIは一度立ち上げたプロセスをそのまま動かし続けて、
ここでハマった。
まずmod_rewriteが用意されている必要があるので、
# ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/
としておく。ここは問題なし。
次に私の場合、実行速度を少しでも稼ぐ為、.htaccessではなく、/etc/apache2/sites-enabled にホストの設定を準備しているのだが、書いてある通りの内容をコピペしただけでは動かなかった。
理由としては単純で、パスが違っているからである。
例ではRewriteEngine onの下に、RewriteRule が並んでいるが、^mt\.fcgi(.*)$ の様に先頭からファイル名で始まることを前提として書いており、例えば/MT-3.2-ja-2/の下に置かれていたりすると、マッチしない為、置換されない。
RewriteRule を書き換えるか、
RewriteEngine on
RewriteBase /MT-3.2-ja-2/
RewriteRule ^mt\.fcgi(.*)$ dispatch.fcgi$1 [L]
RewriteRule ^mt-comments\.fcgi(.*)$ dispatch.fcgi$1 [L]
RewriteRule ^mt-tb\.fcgi(.*)$ dispatch.fcgi$1 [L]
RewriteRule ^mt-search\.fcgi(.*)$ dispatch.fcgi$1 [L]
として、パスがdispatch.fcgiと一致するように書き換えておく。
もう一つ注意点。
私はindex.htmlとmt-check.cgiを削除して、
>IfModule mod_dir.c<
DirectoryIndex mt.fcgi
>/IfModule<
とかしていたのだが、このようにした場合、mod_rewriteで変換が行われずに、mt.fcgiを直接実行しようとするので、注意。
必要であれば、
RedirectMatch ^/mt/$ /mt/mt.fcgi
としておく。
あと、Optionsで、ExecCGIが要るのも忘れずに。
ステップ4: mt-config.cgiを変更する。
ここは普通に変更するだけ。
ステップ5: 動作確認とパラメタチューニングをする。
これも環境に合わせて、
FastCgiServer /home/mtuser/MT-3.2-ja-2/dispatch.fcgi -processes 2
というように、dispatch.fcgiの絶対パスを指定する。
以上、簡単ですが、ご参考程度に。
ご意見、質問があればコメントの方によろしくお願いします。


コメント (1)
good day!
投稿者: career | 2006年07月20日 05:02
日時: 2006年07月20日 05:02