« Ruby用のXML/HTML テンプレートライブラリー | メイン | proxy動かしてみる。 »

Apache2 + FastCGIでMovableType快適環境構築

現在、玄箱の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の絶対パスを指定する。

以上、簡単ですが、ご参考程度に。

ご意見、質問があればコメントの方によろしくお願いします。

バナー バナー

トラックバック

このエントリーのトラックバックURL:
http://blog.idealfuture.net/mt/mt-tb.cgi/49

コメント (1)

career:

good day!

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2006年01月09日 03:02に投稿されたエントリーのページです。

ひとつ前の投稿は「Ruby用のXML/HTML テンプレートライブラリー」です。

次の投稿は「proxy動かしてみる。」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35
  • 累計:
  • 本日:
  • 昨日: