Apache 2.4 にしてからというもの、CGI のエラー(標準エラー出力)が error_log に吐かれなくなってしまった。
これは、CGI の開発などを生業にしている俺には非常に不便だ。
CGI が Internal Server Error となった時、エラーメッセージを確認するために、例えばコマンドラインからその CGI プログラムを実行してみる・・・なんてことをしないといけないのだが、当然、これでは本当のエラー原因を確認出来ないことがある。
やっぱ、CGI として実行されている状況でのエラーメッセージを確認したいのだ。
例えば、require するファイルが存在していない時など、
Can't locate /var/www/exsample/lib/common.pl in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /var/www/exsample/hogehoge.cgi line 25.
みたいに、common.pl が Can't locate とだよってことを教えてほしいわけだ。
2.2 以前の Apache では、上記のような Perl の標準エラー出力が error_log に出力されていたのだが、今は、
[Wed Oct 30 22:23:55.235093 2013] [cgid:error] [pid 15086] [client 202.XXX.XXX.XXX:61290] End of script output before headers: exsample.cgi
だけである。
これじゃあ、CGI がちゃんと走らなかったというのは分かるけど、エラー原因は全然わからんからなあ。
んで、結局、これ、CGI の実行に mod_cgid を使っていたことが原因だった。
LoadModule cgid_module modules/mod_cgid.so
を、
#LoadModule cgid_module modules/mod_cgid.soLoadModule cgi_module modules/mod_cgi.so
という具合に、mod_cgi で実行すれば、error_log に STDERR が表示される。
こんな感じ↓
[Wed Oct 30 22:25:28.028808 2013] [cgi:error] [pid 15171] [client 202.XXX.XXX.XXX:62128] AH01215: Can't locate /var/www/exsample/lib/common.pl in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /var/www/exsample/hogehoge.cgi line 25.
これならデバッグに使えるぞ!
元々、2.2用の httpd.conf を手動で 2.4用に直した時、mod_cgid をロードしたら CGI が動いたので、そうか、mod_cgid でええんやなあ・・・とそのままにしてたけど、さっきマニュアル読んでみたら、mod_cgi には STDERR のログ出力についての記述があるのに、mod_cgid には無いからもしや・・・と思ったら。
まあ、--enable-cgi オプション付けて make したら、httpd.conf には
#LoadModule cgi_module modules/mod_cgi.so
がセットされるので、普通はこんなところで悩まないんだろうな(^^;
ちなみに、mod_cgi は httpd デーモン上で CGI を処理し、mod_cgid は外部の CGI 実行用デーモンで CGI を処理するモジュールであります。外部モジュールから直接 error_log には書き出せんから・・・ってことか?