そのサーバ上で、Perl(5.8.4)のcgiを動かしているのですが、サーバの負荷が高まる場合に限り(同時実行しているプロセス数が40以上程度になると)、CPUなどのリソースには余裕があるにもかかわらず、Premature end of script headers: というエラーをApacheが吐いて、Internal Server Error になってしまいます。
ちなみに、そのcgiからはODBC経由でMySQLに接続しています。
その原因・解決法がわかりました教えてください。
※ Apacheの設定では、子プロセス数を特に制限していません。
※ MySQL側の接続数も100に設定しているため、余裕があります。
http://httpd.apache.org/docs/misc/FAQ-F.html#premature-script-he...
Apache Server Frequently Asked Questions
[Premature end of script headers]というエラーはApache側からするとCGIが何らかの原因でエラーになった場合に発生します。基本はCGIをApache経由ではなく単体で実行しデバッグすることが早道のようです。
http://www.onlineinsider.com/manual/mod/mod_cgi.html.ja.jis
Apache module mod_cgi
とは、いっても上記のような現象の場合は単体での発生を捕らえることは難しそうなので、httpd.confにScriptLog ディレクティブとScriptLogBufferの設定を行うことによってCGIがエラーになった場合にそのCGIへのリクエストとレスポンスをログに出力することができるので、設定後にエラーを発生させてエラーが発生するリクエストをCGIに対して単体で実行して原因を追求した方が良いと思います。
http://lab.sakasta.com/unix/mysql.html
Nix::WebLab
CPUリソースには余裕があるとのことですが
メモリ、DISKIO等はどうでしょうか。
あとMySQLとApacheの設定で実メモリ以上になる設定をしていると
設定の接続数へ達する前に反応がなくなるケースがあります。
Premature end of script headers:
というエラーは直接の原因をあらわしているように見えません。
おそらく最終的に表示ができなくなり
現象的なエラー内容にと考えられます。
> Premature end of script headers:
というエラーは直接の原因をあらわしているよう> に見えません。
は、まさにそうかとおもいます。
メモリもDISKIOも余裕があり、
また、MySQLとApacheの設定も、実メモリ以上になるような設定ではありません。
同時実行しているプロセス数が増えると、単純にContent-typeとテキストを出力するスクリプトさえ動かなくなってしまうため、MySQLでひっかかっているようではなさそうです。
WINSOCK の制限にひっかかっているということはありえますでしょうか?
回答ありがとうございます。
実は、単体では(というか40プロセス程度までは並行して)正常に動いております。したがって、単純なCGIの文法エラーではないと思われます。
、あた、ScriptLogはすでに取得しているのですが、見たところCGIから何も出力されずに終了してしまっているようです。