mod_perl
mod_perl は Perl CGI の実行速度を向上させるためのモジュールです。
通常 Perl CGI は、クライアントから CGI が要求される度に Apache から読み込まれてコンパイル・実行されますが、mod_perl を使用すると一度読み込まれるとその内容をメモリ上に保持しておきます。
従って、次に同じ CGI が呼び出された際には再読み込みすることなく実行されることになり、非常に高速になります。
インストール
mod_perl-2.05, Apache-2.2.19 の例です。
Apache をDSO対応でインストールしておくことが前提となります。
まず、The Apache/Perl Integration Projectからアーカイブを入手し、展開します。
% gzip -dc mod_perl-2.0-current.tar.gz | tar xvf - % cd mod_perl-2.0.5
以下のように、mod_perlをapxsを使ってビルドし、インストールします。
% perl Makefile.PL MP_APXS=/usr/local/apache2/bin/apxs % make % su # make install
Apache-1.3系の場合
mod_perl-1.29, Apache-1.3.37 の例です。
mod_perl は DSO 対応は EXPERIMENTAL な状態なので static に組み込む必要があります。
従って、Apache も最初からビルドし直す必要がありますので、Apacheのアーカイブも入手し、展開します。
% gzip -dc apache_1.3.37.tar.gz | tar xvf - % gzip -dc mod_perl-1.0-current.tar.gz | tar xvf -
mod_perl, apache を展開したら以下のようにまずは mod_perl をインストールします。
% cd mod_perl-1.29 % perl Makefile.PL EVERYTHING=1 APACHE_SRC=../apache_1.3.37 USE_APACI=1 NO_HTTPD=1 PREP_HTTPD=1 % make % su # make install
mod_perl のインストールが終わったら Apache をインストールします。
% cd ../apache_1.3.34
% ./configure --enable-module=so \
--enable-rule=SHARED_CORE \
--disable-rule=EXPAT \
--enable-module=most \
--enable-shared=max \
--activate-module=src/modules/perl/libperl.a
% make
% su
# make install
設定
例えば、.pl だけを mod_perl で動かし、それ以外は mod_perl で動かさないようにするには以下のように設定します。
<FilesMatch "\.pl$">
Options +ExecCGI
SetHandler perl-script
PerlHandler ModPerl::Registry
# PerlHandler Apache::Registry <- Apache-1.3系ならこちら
</FilesMatch>
SetHandler perl-script で Perl script であることを宣言し、PerlHandler ModPerl::Registry, PerlHandler Apache::Registry にて mod_perl を使用することを宣言します。
mod_perl の使用には、Apache::PerlRunというのもあり、両者の違いは以下のとおりです。
| 設定 | 概要 |
|---|---|
Apache::Registry | Preload してかつ Precompile する。 |
Apache::PerlRun | Preload するが、呼び出しごとにコンパイルする。 |
さらに以下のような設定をしておくと便利です。
PerlRequire conf/startup.pl
PerlRequire で Apache 起動時に実行する script を指定できます。
上記の場合、startup.pl が実行時に起動されます。
例えば、startup.pl に以下のように書いておくと、Perlモジュールの検索パスやPerlモジュールのプリロードの設定をすることができます。
#!/usr/local/bin/perl
use lib qw( /project/perllib );
BEGIN {
use Apache;
}
use Apache::Registry ();
use Apache::DBI ();
use DBI ();
use DBD::Pg ();
use Class::DBI ();
use Class::DBI::Pg ();
use Template ();
return 1;
その他設定できる項目は多種多彩です。
下記はごく一部
Apache-2系
| 設定 | 概要 |
|---|---|
PerlInitHandler Apache2::Reload | 変更されたモジュールをサーバの再起動無しに再読み込みする |
Apache-1.3系
※Apache-2系でも使えるものもあります。
| 設定 | 概要 |
|---|---|
PerlWarn On | -w オプションと同等 |
PerlFreshRestart On | サーバ再起動時にプリロードされた全モジュールのリロードを試みる |
PerlInitHandler Apache::StatINC | サーバの再起動を待たずにキャッシュされたモジュールが再コンパイルされるようにする。これを設定しないと開発中は非常に面倒です。 |
さらに詳しい情報は以下の URL でどうぞ。
| タイトル | 概要 |
|---|---|
| メモランダム:mod_perlクイックリファレンス | 日本語の mod_perl のリファレンス |
| ActivePerl5.8/6.mod_perl - Ground-SunLight | mod_perl のインストールから設定まで分かりやすく解説 |
状態確認
以下のような設定を httpd.conf に記述しておくと、http://domainname/perl-status にて mod_perl の状態を確認することができます。
<Location /perl-status>
SetHandler perl-script
PerlHandler Apache::Status
order deny,allow
deny from all
allow from 192.168.0
</Location>
warningについて
mod_perl上でPerl CGIを実行してみると大量のwarningが出ることが多々あります。
特に、「Subroutine ???? redefined」というエラーが大量に出ますが、これはサブルーチンが再定義されているという警告で特に問題ないようです。
Webで検索するとそんな記述もチラホラ見れるし、実際にアクセス数の多いサイトでこのwarningが出たままで2年以上稼働させていても問題ないですし。
ということで、この大量のwarningは邪魔なので以下のようにして出力を止めます。
no warnings 'redefine';