WindowsのApacheでFastCGIを動かす。

2010/04/08 | By KUMA | Filed in: 技術メモ.

掲題の通り。

以下の環境で構築しようとしたが、都合でApacheを2.2.8を使用することとなった。詳しくは後述

  • Windows XP SP3
  • Apache2.2.15→Apache2.2.8
  • Active Perl 5.10
  • mod_fastcgi(2.4.6 AP22)

設定は大まかにここの手順にのっとって実施。

  • PPMからFCGのモジュールを取得「ppm install FCGI」
  • ここからmod_fastcgiモジュール「mod_fastcgi-2.4.6-AP22.dll」をダウンロード。apacheのmodulesディレクトリに入れる。
  • httpd.confに以下を追加。(面倒なので参考にさせてもらった内容をコピペw)

次にこのモジュールを読み込むようhttpd.confに設定を追加します。

あわせてmod_fastcgiの動作設定を行っておきます。ActivePerlをC:/Perlにインストールしていたと仮定して httpd.confに


LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll

<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>

これらを追加します。

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と同様の理由で少なくしています。適宜増減するのがよいかと思います。

と、ここまでやって 、↓なエラーが出て動かない。いろいろ試行錯誤してネットをさまよった結果、

[error] [client 127.0.0.1] (OS 109)パイプは終了しました。  : FastCGI: comm with server “D:/app/Apache2.2/cgi-bin/cgicheck.cgi” aborted: GetOverlappedResult() failed

ここからmod_fastcgiはApache2.2.8までしか動かないことが判明。
背に腹は変えられないのと、イントラ内での使用を前提としているため、仕方なくApacheのVersionを落とした。
Apacheの古いバイナリはここから取得できる。

↓な感じのテストコードを動かして、FastCGIが一応動いた。めでたしめでたし。

#!d:/app/Perl/bin/perl

use FCGI;

eval {

    my $req = FCGI::Request();
    while ($req->Accept() >= 0) {
        print "Content-type:text/html\n\n";
        print "TEST";
    }
    continue {
        $req->Finish();
    }
};
if ($@) {
    die $@;
}


Tags: , , ,

Comments are closed here.