MacOSX には Apache が組み込まれているだけじゃなく PHP も入っていて httpd.conf のコメントを外すだけで利用できるのはわりと有名ですが、なにげに mod_perl も入ってます。
…ということを思い出して、さっそく使ってみようとおもったらハマりました。
有効にする手順は簡単で、
ターミナル.app で sudo vi /etc/httpd/httpd.conf するか、Finderから[移動]→[フォルダへ移動]で /etc/httpd/、httpd.conf のコンテキストメニュー、所有権でオーナーを自分にして開きます。
# 238行目あたり、コメントを外す
LoadModule perl_module libexec/httpd/libperl.so
# 281行目あたり、コメントを外す
AddModule mod_perl.c
# てきとうなところ(412行目あたりに)以下を追加
<IfModule mod_perl.c>
<FilesMatch "\.pl$">
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
PerlSendHeader On
</FilesMatch>
</IfModule>
上記のようにすると場所に関係なく拡張子.plに mod_perl パワーが効くと。保存して閉じ、システム環境設定 共有のパーソナルWeb共有の再起動。
#!/usr/bin/perl
use Data::Dumper;
print "Content-type:text/html\n\n";
print "<pre>Hello! by perl $]\n";
print Dumper \%ENV;
テストとして、以下のようなファイルを test.pl とかでウェブディレクトリ(変えていなければ /Library/WebServer/Documents/ )に保存。実行権を与える(chmod 755 /Library/WebServer/Documents/test.pl)。
http://localhost/test.pl にアクセスしてみる。しかし!非情にも「Safari はこの場所のデータを読み込めませんでした」。
ふむ。うーん、mod_perl 的におかしいのか?とか、エラーログみても何も出てないし、うーんうーん。telnet で見てみると、ほんとに何も吐き出されていません。
$ telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.pl HTTP/1.1
Host:localhost
Connection closed by foreign host.
おもしろいことに、エラー出力はできて、tail -f /var/log/httpd/error_log して
use Data::Dumper;
print STDERR "<pre>Hello! by perl $]\n";
print STDERR Dumper \%ENV;
すればターミナルで閲覧できます。
ま、いっかこれで。って、よくないよ
いろいろ調べたところ、利用しているperlが古いと mod_perl で print() が使えず(正確には、STDOUT が使えない)、
$r = Apache->request;
$r->print(Dumper \%ENV);
とかしないといけないらしい。MacOSは10.3.9で、さきほどのエラーログを利用した出力で確認したバージョンは 5.008001、'MOD_PERL' => 'mod_perl/1.26'。1.26。1.26って古いってことなのかな。
まあいいよ。Apache は mod_so が使え簡単なので mod_perl を入れ直し。http://perl.apache.org/dist/mod_perl-1.0-current.tar.gz をDL。
$ tar zxvf mod_perl-1.0-current.tar.gz
$ cd mod_perl-1.29
$ perl Makefile.PL USE_APXS=1 WITH_APXS=/usr/bin/apxs EVERYTHING=1
$ make && make test && sudo make install
これでApache再起動。あっさり解決。
Hello! by perl 5.008001
$VAR1 = {
'MOD_PERL' => 'mod_perl/1.29',
(省略)
};
アップル、PHPはマメにUPしてくるくせに、mod_perl は古いまま?(ボソっ)
PerlHandler Apache::Status
PerlSetVar StatusTerse On
みたいなエレガントな検証もすればよかったな。
朝からハマってました。これでスッキリ。
せっかくの日曜日が...orz
10.4ではだいじょうぶとのこと