mod_perlを動かしてみる。プラットフォームはWindows2000を使用します。
WindowsでPerlを動かすにはActivePerlが必要です。
ということで、ActiveStateからActivePerlをダウンロードしてインストールします。
インストールは英語ですが大して難しくないから省略します。
注意する点は、インストールパスに日本語/空白を含めないこと。
mod_perlはApacheのモジュールとして動くので、当然ですがApacheが必要です。
Windows用のApacheをダウンロードして、インストールします。
ダウンロードするバージョンは1.xを選択します。インストール方法はこれまた簡単だから省略。
これも、インストールパスに日本語/空白を含めないように。
mod_perlをインストールするにはppmを使用するのが便利です。
コマンドプロンプトを起動して、次のように入力するとmod_perlがインストールできます。
ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl.ppd
インストールの最後に、Apacheのモジュールディレクトリを訪ねてくるから
C:/Apache/modules
こんな感じで、Apacheのモジュールディレクトリを指定してあげます。
以上でmod_perlのインストールは完了です。
Apacheの設定ファイルconf/httpd.confを開いて、以下を適当な場所にコピペして保存します。
そして、Apacheを再起動すると設定完了です。
# mod_perlモジュールの読み込み
LoadModule perl_module modules/mod_perl.so
# 拡張子cgiのファイルをmod_perlで実行する
<Files *.cgi>
# ハンドラの関連付け
SetHandler perl-script
# mod_perlをApache::Registryで動かす(Apache::PerlRunで動かすることも出来る)
PerlHandler Apache::PerlRun
# HTTP応答ヘッダの先頭に"status 200 OK"を自動的に追加する
PerlSendHeader On
# @INCディレクトリ内にあるファイルの変更を自動的に判断する
PerlInitHandler Apache::StatINC
# CGIで実行する
Options +ExecCGI
</Files>
# httpdを再起動した時に前の状態を捨てる
PerlFreshRestart On
以上の設定だと、拡張子cgiのファイルが全てmod_perl(Apache::PerlRun)で実行されます。
mod_perlが正常に動いているかどうかを確かめるには、次のスクリプトを実行させます。
print "Content-type: text/plain\n\n";
print "Hello $ENV{'MOD_PERL'}";
そして、以下のようにブラウザで表示されれば、mod_perlで動いてることになります。
Hello mod_perl/1.26_01-dev
※mod_perlで動かすと環境変数MOD_PERLにmod_perlのバージョンがセットされます。
筆者の理解できる範囲で、mod_perlに適したスクリプトの書き方のコツを列挙してきます。
これが基本中の基本です。以上をまとめたのが次のサンプルで、実行すると「Hello World」と表示されます。
#!C:/usr/local/bin/perl -w
use strict;
use vars qw ($a);
$a = 'Hello ';
print "Content-type: text/plain\n\n";
print $a;
print &b;
sub b{ my $c = 'World'; }
exit;
他にも注意する点として
などが挙げられます。まだ他にもあると思いますが、筆者はあまり詳しくないので、ここまでしか説明できません。。
基本的に、行儀の良いプログラムを書けばmod_perlでも動いてくれると思います。
mod_perl(Apache::Registry)を動かすと、Perlインタープリタがメモリに常駐し、Perlスクリプトは初回の1度だけコンパイルされ、メモリに常駐します。
したがって、初期化していない変数はデータが永続的にメモリに残ることになり、動作に不具合が発生します。
なお、Perlスクリプトが書き換えられた場合は、自動的にコンパイルし直されます。
Apache::PerlRunで動かすと、Perlインタープリタだけがメモリに常駐し、Perlスクリプトは毎回コンパイルされます。
初めてmod_perlを動かす場合、Apache::RegistryよりもApache::PerlRunで動かした方がトラブルが少なく済むでしょう。
実際に動かしてみて、CPU使用率を測ってみました。
□Perlで動いてる時
□Apache::PerlRunで動いてる時
□Apache::Registryで動いてる時
CPU使用率を見ると、Perlで動いている時と比べ、数十分の1程度にCPU負荷が減っているように見えます。
しかし、Windows + mod_perl1.xの環境ではシングルスレッドでしか動かないので、大量の要求があると詰まってしまい使いモノになりません。 Windowsでマルチスレッドを使うには、Apache2+mod_perl2が必要のようです。。