ホーム > Windows + Apache + mod_perl > 掲示板

Windows + Apache + mod_perl

作成日: 2003/04/08

 mod_perlを動かしてみる。プラットフォームはWindows2000を使用します。

mod_perlのインストール

ActivePerlのインストール

 WindowsでPerlを動かすにはActivePerlが必要です。
ということで、ActiveStateからActivePerlをダウンロードしてインストールします。 インストールは英語ですが大して難しくないから省略します。
注意する点は、インストールパスに日本語/空白を含めないこと。

Apacheのインストール

 mod_perlはApacheのモジュールとして動くので、当然ですがApacheが必要です。 Windows用のApacheをダウンロードして、インストールします。 ダウンロードするバージョンは1.xを選択します。インストール方法はこれまた簡単だから省略。
これも、インストールパスに日本語/空白を含めないように。

mod_perlのインストール

 mod_perlをインストールするにはppmを使用するのが便利です。
コマンドプロンプトを起動して、次のように入力するとmod_perlがインストールできます。

ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/mod_perl.ppd

インストールの最後に、Apacheのモジュールディレクトリを訪ねてくるから

C:/Apache/modules

こんな感じで、Apacheのモジュールディレクトリを指定してあげます。
以上でmod_perlのインストールは完了です。

Apacheの設定追加

 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で動く一番シンプルなスクリプト

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で動くスクリプトの書き方

筆者の理解できる範囲で、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はどのように動いているのか?

mod_perl(Apache::Registry)を動かすと、Perlインタープリタがメモリに常駐し、Perlスクリプトは初回の1度だけコンパイルされ、メモリに常駐します。 したがって、初期化していない変数はデータが永続的にメモリに残ることになり、動作に不具合が発生します。
なお、Perlスクリプトが書き換えられた場合は、自動的にコンパイルし直されます。

Apache::PerlRunで動かすと、Perlインタープリタだけがメモリに常駐し、Perlスクリプトは毎回コンパイルされます。

初めてmod_perlを動かす場合、Apache::RegistryよりもApache::PerlRunで動かした方がトラブルが少なく済むでしょう。

mod_perlは本当に軽いのか

 実際に動かしてみて、CPU使用率を測ってみました。

Perlで動いてる時
Perlで動いてる時のCPU使用率

Apache::PerlRunで動いてる時
Apache::PerlRunで動いてる時のCPU使用率

Apache::Registryで動いてる時
Apache::Registryで動いてる時のCPU使用率

 CPU使用率を見ると、Perlで動いている時と比べ、数十分の1程度にCPU負荷が減っているように見えます。

しかし、Windows + mod_perl1.xの環境ではシングルスレッドでしか動かないので、大量の要求があると詰まってしまい使いモノになりません。 Windowsでマルチスレッドを使うには、Apache2+mod_perl2が必要のようです。。

ホーム > Windows + Apache + mod_perl > 掲示板