mod_perl設定記録

mod_perlも無事インストールできたし今度は設定の方を見て行きたい。設定といってもhttpd.confに追加するだけですけどね。それでmod_perl環境を整えた事になる。

最初にCPANよりApacheモジュールに関するファイルをインストールする。

 $ cpan
 cpan > install Apache2::Module

だったと思うんだよね。少し自信ない。

次にhttpd.confの設定。これはやられた。いろんなところのサイトを参考にしながらやっていたんですが同じように設定してもまったく動作しない。何故かというと、Apachemod_perlの環境のバージョン違いなんですよ。参考にしたサイトがApache1.3+mod_perl1.0だったのに私の環境はApache2.0+mod_perl2.2だったのよ。

Apache1.3+mod_perl1.0
<IfModule mod_perl.c>
Alias /perl/ /home/knoppix/public_html/cgi-bin/
Alias /cgi-perl/ /home/knoppix/public_html/cgi-bin/

<Location /perl>
  SetHandler perl-script
  PerlHandler Apache::Registry
  Options ExecCGI
  Allow from all
  PerlSendHeader On
</Location>

<Location /cgi-perl>
  SetHandler perl-script
  PerlHandler Apache::PerlRun
  Options ExecCGI
  Allow from all
  PerlSendHeader On
</Location>
</IfModule>

上記ではApache1.3+mod_perl1.0の環境であれば問題ないが、私の環境ではエラーが出た。


[Thu Jul 09 21:32:47 2009] [error] [client 192.168.32.1] failed to resolve handler `Apache::Registry':
Can't locate Apache/Registry.pm in @INC (@INC contains: /usr/local/lib/perl5/5.10.0/i686-
linux /usr/local/lib/perl5/5.10.0 /usr/local/lib/perl5/site_perl/5.10.0/i686-
linux /usr/local/lib/perl5/site_perl/5.10.0 . /usr/local/apache2) at (eval 2) line 3.\n
Apache/Registry.pmが存在しないって言ってる。

確かに存在しなかった。で探したところあるにはあったよ。

 $ find `perl -e 'print "@INC"'` -name *.pm | grep Registry.pm
 .../usr/local/lib/perl5/site_perl/5.10.0/i686-linux/ModPerl/Registry.pm

 $ find `perl -e 'print "@INC"'` -name *.pm | grep PerlRun.pm
 .../usr/local/lib/perl5/site_perl/5.10.0/i686-linux/ModPerl/PerlRun.pm

思うにmod_perl2.0ではインストールの場所が異なっているんだね。それで下記のように修正。

<IfModule mod_perl.c>
Alias /perl/ /home/knoppix/public_html/cgi-bin/
Alias /cgi-perl/ /home/knoppix/public_html/cgi-bin/

<Location /perl>
  SetHandler perl-script
  PerlHandler ModPerl::Registry
  Options ExecCGI
  Allow from all
  PerlSendHeader On
</Location>

<Location /cgi-perl>
  SetHandler perl-script
  PerlHandler ModPerl::PerlRun
  Options ExecCGI
  Allow from all
  PerlSendHeader On
</Location>
</IfModule>

これで設定完了。何をやったかと言うとアクセスするディレクトリに応じてmod_perlのタイプを分けたのよ。一応、いろんな事を試してみたいからね。ちょっと下記にまとめてみた。

アクセスURL Perlの動作
http://[HOST NAME]/~knoppix/cgi-bin/ CGI Perlが動作する
http://[HOST NAME]/perl/ ModPerl::Registryが動作する
http://[HOST NAME]/cgi-perl/ ModPerl::PerlRunが動作する

見ているスクリプトは1つだが、アクセスするURLによって走る処理が変わってくる。テストするには面白い環境です。あと、上記設定はhttpd.confから外出しにしてもよいかもしれませんね。

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

「conf/modperl.conf」に設定内容を記述した方がのちのちのためになると思います。

mod_perlタイプ 内容
ModPerl::Registry 1度スクリプトコンパイルしたらスクリプトの変更があるまで
再度コンパイルしない。ゆえに高速
ModPerl::PerlRun スクリプトを読み込む毎にコンパイルする。Registryと比較すると遅いが、
Perlの処理系は組み込まれているので通常のCGI Perlよりは断然早い

そんな感じかな。では