理系学生日記

おまえはいつまで学生気分なのか

CGI 関係で Apache 1.x から Apache 2.x に乗り換えるときのハマりポイント

ぼくはちょっくら Apache 1.x から 2.x に乗り換えようとか調子コいたことをやってみたんですけど,なんか CGI とかでいろいろ不都合が出たりしたので,ちょっとメモしておこうと思ったのでした.

**Apache::SizeLimit

メモリがデカくなりすぎるとプロセス kill してくれる Apache::SizeLimit ですが,

Apache::SizeLimit - search.cpan.org> This version is only for httpd 1.x and mod_perl 1.x series.

Future versions of this module may support both.

Currently, Apache2::SizeLimit is bundled with
mod_perl 2.x for that series.

<< ということですので,Apache2::SizeLimit なんかを使った方が良さそうです.

**Apache::Registry

Apache 2.x というよりは mod_perl2 の話かもしれませんが,少なくとも mod_perl2 を apt 等でインストールする場合には Apache::Registry は付属してきません.結果として Apache の error.log には Apache::Registry なんてないよとかいう die のすかしっぺみたいなログが吐かれたりします.

たぶんですけど,Apache::Registry の代わりに ModPerl::Registry なんてのがインストールされてるので,それで置換してやれば良いと思います.

mod_perl: ModPerl::Registry - Run unaltered CGI scripts persistently under mod_perl> XXX: STOPPED here. Below is the old Apache::Registry document which I haven't worked through yet. <<

**ModPerl::Registry

ModPerl::Registry ですけど,これは ModPerl::RegistryCooker を継承していて,ModPerl::RegistryCooker::chdir_file はこんな感じになってます

|perl|

#

func: chdir_file

dflt: NOP

desc: chdirs into $dir

args: $self - registry blessed object

$dir - a dir

rtrn: nothing (?or success/failure?)

#

*chdir_file = &NOP; ||< NOP の定義はこれ.

|perl| use constant NOP => ''; ||< あらあら,何もしてくれないぽいですね.

chdir してくれないものですから,CGI 実行時のカレントディレクトリがルート ('/') になってたりします*1. これで何が困るかというと,普通はあんまし困らないんだけど,相対パス指定で require とかしちゃってると,そんなファイルねーよとか言われて 500 Internal Server Error が返ってきたりします. 絶対パス指定をするか,ModPerl::Registry の代わりに ModPerl::RegistryPrefork とかを使うと解決したりします.

ModPerl::RegistryPrefork はこんなことをしてくれます.

|perl| *chdir_file = &ModPerl::RegistryCooker::chdir_file_normal; ||<

*1:threaded MPM の場合のみ?