mod_perl設定記録
mod_perlも無事インストールできたし今度は設定の方を見て行きたい。設定といってもhttpd.confに追加するだけですけどね。それでmod_perl環境を整えた事になる。
最初にCPANよりApacheモジュールに関するファイルをインストールする。
$ cpan
cpan > install Apache2::Module
だったと思うんだよね。少し自信ない。
次にhttpd.confの設定。これはやられた。いろんなところのサイトを参考にしながらやっていたんですが同じように設定してもまったく動作しない。何故かというと、Apache+mod_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の環境であれば問題ないが、私の環境ではエラーが出た。
Apache/Registry.pmが存在しないって言ってる。
[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
確かに存在しなかった。で探したところあるにはあったよ。
$ 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よりは断然早い |
そんな感じかな。では