スクリプトメモ » Perl/mod_perl
2006年02月01日
mod_perl2 インストール

テスト用のサーバーにPlamo LinuxとApache2.0.54が入ってるわけですが、
今回、これにmod_perlをインストールしようと試行錯誤してみました。

mod_perlのサイトはここ
もちろん全部英語です。
が、幸い英語が読めるので、インストールそのものは特別問題はありませんでした。

mod_perl1.0とmod_perl2.0があるので、Documentを読むと、Apache1.xではmod_perl1.0、Apache2.xではmod_perl2.0をインストールしなければならない、とのことなので、mod_perl2.0をダウンロードしてきました。
インストールの基本はlinuxならどれも同じ、

$ perl Makefile.PL
$ make
$ su
# make install

実際にはインストールに必要なモジュール
CGI.pm 3.11
Compress::Zlib 1.09
があるので、これらをインストールします。
順番的には、

mod_perlをDSOとしてインストールする場合
1. perl
2. Compress::Zlib、LWP
3. MySQLなど
4. Apache
5. PHP
6. 自分が使いたいPerlモジュール、CGI.pm
7. DBIモジュール
8. DBDモジュール
9. mod_perl

モジュール類は最後でも良いと思います。

mod_perl(とPHP)をstaticとしてインストールする場合
1. perl
2. Compress::Zlib、LWP
3. mod_perl
4. PHP
5. Apache
6. 自分が使いたいPerlモジュール、CGI.pm
7. MySQLなど
8. DBIモジュール
9. DBDモジュール

MySQLのインストールはApacheの前でも可能です。

すでにApacheまでインストールされていれば、DSOとしてインストールすることになると思います。
インストールの方法は、インストールの解説ページDSOの場合とStaticに分けて書かれています。

Perlをインストールする際、mod_perlでスレッドサポートが必要なら、-Dusethreadsオプションを付けて./Configureを実行させます。
今回は、Perlを5.8.4から5.8.7にアップデートするのをかねて、スレッドサポートにさせました。

mod_perlのインストールが終わったら、httpd.confの設定です。
make installのあとで、httpd.confの設定をするように言われるので、PHPをインストールしたときに作られるPHPモジュールのロード部分の下にmod_perlのロード命令を追記します
LoadModule php5_module    modules/libphp5.so
LoadModule perl_module    modules/mod_perl.so

mod_perlを使用してPerlスクリプトを実行するディレクトリと、普通にCGIとして実行させるディレクトリを指定出来るので、

<IfModule mod_perl.c>
    Include conf/modperl.conf
</IfModule>

としてmod_perl専用の設定ファイルを読み込ませます。
もちろんhttpd.confの中に直接書いても良いのですが、ファイルサイズが大きくて編集しにくい(記述場所を探しにくい)ので、別ファイルにしておきます。
modper.confファイルの中に、

<Location /perl>
    SetHandler perl-script            スクリプトの種類
    PerlHandler ModPerl::Registry       実行モジュール
    Options ExecCGI                      スクリプト実行可能
    Allow from All                          全環境から接続可能
    PerlSendHeader On                Statusヘッダを出力させる
</Location>

設定の詳細は、コンフィギュレーション解説ページに書かれています
とはいえ、自分の設定は参考にしたサイトに書かれていた内容そのままなんですが、、、(^^;

ウェブサイトでmod_perlの解説サイトを検索すると、2行目の名前が、Apache::Registryとなっている物が多く、mod_perl2.0を、Apache::Registryで実行させると、Internal Server Errorが表示されます。
で、ログには
Can't locate Apache/Registry.pm in @INC ~
でもって、@INCの内容(ディレクトリ)を全部検索してみても、やっぱりApache.pmはもちろん、Apacheディレクトリもありません。

しかし、ブラウザに表示されるエラーページの一番下(サーバー情報)には、
Apache/2.0.54 (Unix) PHP/5.0.5 mod_perl/2.0.2 Perl/v5.8.7 Server at 192.168.1.2 Port 80
と書かれているので、mod_perlがインストールされているのが確認出来ます。

あとから知ったことなのですが、mod_perl2には、Apache::Registryモジュールがありませんので、上記のようにModPerl::Registryで動かさないと行けない、というわけです。

ここから、mod_perl独特の方法による、Perlスクリプトの作り方の解説に入ります。

mod_perlのドキュメントや、Apache2 APIに書かれているとおり、Apache::モジュールが存在しません。
Apache::RegistryのかわりにModPerl::Registryを使用して、Apache2 APIにしたがって、Apache::Requestのかわりに
use Apache2::RequestUtil ()
use Apache2::RequestRec ();
を使用します。

print "Content-type: text/html\n\n";
を、Apache2::RequestRec ();を使ってエミュレート(?)する方法です。 Apache APIに書かれているとおり、
use Apache2::RequestRec ();
するのはいいけど、$r->content_type('text/html');の$rはどこから来ているの?という疑問がありましたが、User's GuidのWriting mod_perl Handlers and Scriptsに、Getting the $r Objectとして書かれています。
ModPerl::Registryからくる変数で、基本的にはmyを付けなくても、グローバルに使えるようなのですが、どうやら自分の環境ではグローバル変数にならないようなので、
my $r=shift;
で引っ張ってきます。
で、環境変数を表示させるスクリプトがこのようになりました。

use strict;
use warnings FATAL => 'all';

use Apache2::RequestRec ();
my $r=shift;
$r->content_type('text/html');

print "ENV_MOD_PERL:".$ENV{GATEWAY_INTERFACE}." ".$ENV{MOD_PERL}."\n";

一部のAPIには、
$r = Apache2::API_NAME -> new;
のような書き方をする物もあるようです。

参考にしたページ(サイト)
ほとんどがmod_perl1.x向けに書かれています
My Linux Diary
RAT Portal
Apache+mod_perlでCGIを使うには?
memo random
CGI Laboratory
mod_perlのインストール(Maya's Laboratory)
Perlのモジュールをインストールしよう!(自宅サーバーで行こう)
Apache2 + mod_perl2.0.1 + Sledge-1.11(おいぬま日報)
以下、Apacheのサイト
The Apache Software Foundation
マルチプロセッシングモジュール (MPM)
Apache HTTP サーバ バージョン 2.0 ドキュメント
以下、mod_perlのサイト(Apacheドメイン内)
mod_perl
概要(mod_perl2)
ダウンロード
インストールガイド(mod_perl2)
API(mod_perl2)
ユーザーズガイド(mod_perl2)
Writing mod_perl Handlers and Scripts #Getting_the_C__r__Object
Writing mod_perl Handlers and Scripts #ModPerl::Registry Handlers Family
以下、Perl(CPAN)のサイト
Perl.org
Perl.com
CPAN
Compress::Zlib
LWP(libwww)


Wicker Wings