ぼくはちょっくら Apache 1.x から 2.x に乗り換えようとか調子コいたことをやってみたんですけど,なんか CGI とかでいろいろ不都合が出たりしたので,ちょっとメモしておこうと思ったのでした.
**Apache::SizeLimit
メモリがデカくなりすぎるとプロセス kill してくれる Apache::SizeLimit ですが,
Apache::SizeLimit - Because size does matter. - metacpan.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 の場合のみ?