mod_perl

最終更新日時:2011-08-04 00:00:00
Apache 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::RegistryPreload してかつ Precompile する。
Apache::PerlRunPreload するが、呼び出しごとにコンパイルする。


さらに以下のような設定をしておくと便利です。

 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-SunLightmod_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';


お問い合わせは 掲示板 にて。