Windows上のApacheでFastCGIを動かそうとして少し手こずったので、備忘録的にエントリを書こうと思います。
はじめに
このエントリは次のような方を対象としています。
- Windows上でApache 2.2.9以降を使用している。
- ActivePerlを使用している。
- Movable Type 5.1を使用している。
- Movable TypeをFastCGI化して少しでも動作を速くしたい。
Movable Typeが重すぎる
事のきっかけは、ブログ更新の時に常に感じていた「Movable Typeがあまりにも重い」という事でした。
私がMovable Typeを運用しているサーバはPhenom II X4 945(3.0GHz)で動いており、私のサイトのようなアクセス数が少ない個人サイトの運営にはまったく困らないスペックなのです。
ところがMovable Typeだけは別でした。画面上の何かしらのアイテムをクリックしてから次の画面が表示されるまでの時間が長いことこの上なく、まさしく「もっさり」という形容詞がふさわしいという動きの遅さでした。そしてこれがブログ更新の際のストレスにもなっていたのです。
そこで私はネットを検索していろいろと調べた結果、「Movable TypeをFastCGIで動かすと高速化できる」という事を知りました。早速私はMovable Typeの高速化に挑戦することにしたのですが一筋縄ではいきませんでした。
Apache 2.2.9以降では公式のmod_fastcgiが上手く動かないらしい
まずはじめに私はいくつかのサイトを検索してMovable TypeをFastCGIで動かす具体的な方法を調べました。大まかな手順は以下の通りです。
- 公式サイトからmod_fastcgi-2.4.6-AP22.dllを入手してApacheのmodulesフォルダに配置する。
- httpd.confを書き換えてMovable TypeがFastCGIで動くように設定する。
私も当然この手順を試してみたのですがどうにもうまく動いてくれないのです。
Movable Typeを試しに動かそうとするとInternal Server Errorが表示され、Apacheのログには次のようなエラーが記録されていました。
(OS 109)パイプは終了しました。 : FastCGI: comm with server (中略) aborted: GetOverlappedResult() failed
ところが私が検索して出てきたサイトやブログの方々は何の問題もなくMovable TypeのFastCGI化に成功しているのです。
さらに詳しく海外サイトなども調べてみると、どうやら私と同様の問題に悩まされている方が何人かいらっしゃるようで、結局はApache 2.2.9以降では通常の方法で手に入るmod_fastcgi-2.4.6-AP22.dllはうまく動かないと言うことが分かりました。
非公式版mod_fastcgiを使ってみる。
しかし、世の中は広く、mod_fastcgiのソースを独自にビルドしてApache 2.2.9以降に対応したバイナリを配布してくださっている方がいました。何ともありがたい。
早速そのバイナリを入手して、Apacheのmodulesフォルダにインストールしてみたところ、一発でMovable Typeが起動しました!
というわけで、Windows版Apache 2.2.9以降でFastCGIを動かす手順
- CPANからFCGIモジュールとCGI::Fastモジュールを入手してインストールします。
- こちらからApache 2.2.9以降向けにビルドされたmod_fastcgiのバイナリをゲットします。x86版とx64版がありますので、自分のOSのプラットフォームに合った物を選択してください。
- 入手したmod_fastcgi.soをApacheのmodulesフォルダにインストールします。
- httpd.confを書き換えてMovable TypeがFastCGIで動くように設定します。
設定例LoadModule fastcgi_module modules/mod_fastcgi.so
<IfModule mod_fastcgi.c>
FastCGIConfig -initial-env PERL5LIB=C:/Perl/lib;C:/Perl/site/lib -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesses 3 -maxProcesses 15
AddHandler fastcgi-script .fcgi
</IfModule><Directory “Movable Typeがインストールされているディレクトリのパス”>
<IfModule mod_fastcgi.c>
AllowOverride None
<FilesMatch “^mt(?:-(?:comments|search|ftsearch|tb|cp))?.cgi$”>
SetHandler fastcgi-script
</FilesMatch>
</IfModule>
</Directory> - Enjoy!
Movable TypeはFastCGIにより高速化されたのか
結果から申し上げますと、ハッキリとわかるぐらいに高速化されました。
まず、アイテムをクリックしてから次の画面が現れるまでの反応速度がかなり向上し、ストレスを感じなくなりました。これならブログ更新のモチベーションも保てそうです。
次に再構築の時間ですが、1分程かかっていたものが44秒まで短縮されました。私のブログは記事数が少ないため再構築にもそれほど時間がかからないのですが、記事数が多いブログを運営されている方はこの差はもっと大きくなるのではないかと思います。
というわけで、Movable Typeの重さに悩まされている方には、FastCGIは良い高速化手段の一つであると言えます。ただしPerlのプロセスがしばらくの間常駐してメモリを喰い続けるというデメリットもあるわけですが、それでもこれぐらいの速度向上ならばトレードオフといったところでしょう。