結局、mod_cgi で CGI 実行しないと STDERR は捨てられちゃうんだな

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.so
LoadModule 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 には書き出せんから・・・ってことか?

トラックバック(0)

このブログ記事を参照しているブログ一覧: 結局、mod_cgi で CGI 実行しないと STDERR は捨てられちゃうんだな

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/2738

コメントする

このブログ記事について

このページは、shinodaが2013年10月31日 06:58に書いたブログ記事です。

ひとつ前のブログ記事は「「勝鯉」を飲んで、来年のカープの躍進を祈りましたぞ」です。

次のブログ記事は「久しぶりに地鶏食堂のラーメン定食を」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら