前回に引き続きWin32版Apache関係のTipsを書いていきたいと思います。
まもなくMovable Type 4.2が正式版になる予定ですが、MT4.2において進化した機能のひとつがFastCGI対応です。
これまでもFastCGI上で動作させることは可能だったのですが、安定性など不安要素があり、簡単にお勧めできる手法ではありませんでした。
今回MTOSでの成果が取り込まれたことにより、いくつかの既知の制限事項は残しているものの、安定性の問題はクリアされたようです。
そのため今回のバージョンアップを機に、FastCGI環境を試したいという方もいるかと思います。
そこで今回はWin32版ApacheのFastCGI環境でMovable Typeを動作させる方法について、いくつか書いておきたいと思います。
Apache2.xにおいて、FastCGIのモジュールは2種類(mod_fastcgi/mod_fcgid)あり、そのどちらでも動作します。
設定方法も、Movable Type Wikiに書かれている方法をはじめ、Web上に多数の事例がありますが、ここでは、私がいつも使っている環境、つまり前回紹介した方法2の環境を、mod_fastcgiを使った環境へ移行させる方法を書きたいと思います。
前提として、すでに前回の方法2、つまりperl.exeの位置を変えることでMTのshebang行を変えることなく動作するAapche2.x環境が稼動しているものとします。
- Perlモジュールをインストールする
-
FastCGIでPerlスクリプトを動作させるためには
CGI::Fast
FCGI以上2つのモジュールが必要となります。CGI::FastはActivePerlには最初から導入されていますので、ここではFCGIをインストールします。「ファイル名を指定して実行」で次のコマンドラインを実行してください。
ppm install FCGI
これでPerl環境の準備は完了です。
- mod_fastcgiをインストールする
-
次にApacheのモジュールであるmod_fastcgiをインストールします。mod_fastcgiは公式サイトからダウンロードできます。
mod_fastcgi-2.4.6-AP22.dllが現在(2008年7月時点)での最新であるようです。
ダウンロードしたmod_fastcgi-2.4.6-AP22.dllをそのままApacheのmodulesフォルダに移動します。次にこのモジュールを読み込むようhttpd.confに設定を追加します。
LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll
あわせてmod_fastcgiの動作設定を行っておきます。ActivePerlをC:/Perlにインストールしていたと仮定してhttpd.confに
<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>
この4行を追加します。
FastCGIConfigディレクティブの部分が長くなっていますが、mod_fastcgiの動作を決める部分となりますので、多少解説します。
- -initial-env PERL5LIB=C:/Perl/lib;C:/Perl/site/lib
前回の方法2ではPerlにライブラリパスを指定するためにSetEnvディレクティブを用いていましたが、mod_fastcgiは、この設定を引き継ぎませんので、再度指定する必要があります。
- -autoUpdate
mod_fastcgiを使う理由のひとつでもあるのですが、FastCGIで起動したスクリプトが更新された場合に現在のインスタンスを終了し、新しいインスタンスを生成します。
現在のMovable Typeでは、プラグインの入れ替えを行った場合や、設定を変更した場合に、再起動の必要があるため、根本的な解決ではないものの、この機能が大変有効です。- -idle-timeout 120
通信待ちを行う秒数を設定します。再構築の際など、長時間待つ恐れがあるので、デフォルトの30秒では短すぎる場合があります。
- -killInterval 3600
processSlackやmaxProcessesなどのポリシーにしたがってインスタンスの整理を行う間隔を秒数で指定します。デフォルトは300秒です。
- -maxClassProcesses 3
1つのFastCGIサーバー(スクリプト)から生成されるインスタンスの最大数。デフォルトは10なのですが、MTはかなり大きいスクリプトで、1インスタンスのメモリ使用量もかなりありますので、最初は少なめにしておき、適宜増減するのがよいかと思います。
- -maxProcesses 15
全体で存在できるインスタンスの最大数。デフォルトは50なのですが、maxClassProcessesと同様の理由で少なくしています。適宜増減するのがよいかと思います。
autoUpdateオプションについて:
上に書いたとおり、便利なautoUpdateオプションではあるのですが、タイムスタンプを比較するという動作のため(?)、FastCGIServerディレクティブを用いてプロセスを起動するためのコマンドラインを定義した場合には、この機能が無効となります。
ドキュメントにも記載がないため、autoUpdateオプションとFastCGIServerディレクティブを併用している設定例をみかけますが、この場合FastCGIServerディレクティブが優先されます。
- MTがmod_fastcgiを使うよう設定する
-
次にMTのアプリケーションディレクトリの設定で特定のスクリプトがFastCGIで起動されるよう設定します
どれを高速化したいかにもよりますが、ここでは次の5つをFastCGI化することにしますmt.cgi
mt-comments.cgi
mt-search.cgi
mt-tb.cgi
mt-feed.cgi
そこでhttpd.confであれば、
<Directory "/path/to/mt">
<IfModule mod_fastcgi.c>
<FilesMatch "^mt(?:-(?:comments|search|tb|feed))?\.cgi$">
SetHandler fastcgi-script
</FilesMatch>
</IfModule>
</Directory>
この7行を追加します。
「/path/to/mt」の部分は、MTのアプリケーションディレクトリとなるよう適宜書き換えてください。
.htaccessに設定を記述する場合には、前後各1行(Directoryディレクティブ)は不要です。
これで設定は完了です。LaunchBackgroundTasksについて:
autoUpdateオプションの説明において、状況に応じてインスタンスを再生成する必要があることを書きましたが、Movable Typeのもうひとつの制限事項として、mod_perl/FastCGI環境下において、バックグラウンドでのビルドを行うことができません。
この機能はLaunchBackgroundTasksという環境変数で有効・無効の切り替えができるようになっているのですが、MT4ではmod_perl/FastCGI環境であれば無条件に無効となります。
また、この制限を解消するためにMT-Dispatchプラグインという便利なプラグインが公開されているのですが、残念なことにActivePerl環境下では動作しません。
- 動作
-
あとはApacheを起動すれば、FastCGI環境で動くようになっているはずです。
タスクマネージャなどを起動してMTへのアクセス時にperl.exeが起動されているかを確認してください。
起動に失敗した場合やCGIの動作に問題があった場合、その多くはApacheのエラーログに出力されますので、これを参考に対処するとよいでしょう。メモリ使用量が増え続けるなど、動作に不安がある場合には、定期的にスクリプトのタイムスタンプを更新する仕組みを用意して、定期的にFastCGIサーバーの再起動を行うようにすれば安心です。
元のCGI環境に戻したい場合、mod_fastcgiを読み込まないよう、httpd.confのLoadModuleの行をコメントアウトします
#LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll
あとはApacheを再起動すれば元の環境に戻ります。
私自身は、ローカルにmt.cgiだけをFastCGI化した環境を作って、MTテンプレートの編集環境にしています。管理画面がさくさく動くので大変快適です。
しかしながら、調子にのって複数の環境を作っていくとメモリ圧迫の原因にもなりますので、タスクマネージャなどでメモリの使用量を確認するとよいでしょう。