2006年02月の駄文
2006年02月28日……わかったぁ!!!
夜の3時過ぎまでApacheやCGIと格闘して、やっとわかりました。
詳しくは技術的雑談に書く予定ですが、新サーバにデータを移転させてから何をやっても「Premature end of script headers」というエラーが出てきてしまうという問題に直面していました。
でも、不思議なのは、トップコンテンツに使用しているFreeStyleWikiは問題なく動くのに、箱庭や掲示板、はたまた、HTTPヘッダーと1行本文だけ出力するようなhelloworld.cgiたいなものまで動かなくなってしまったことです。
test.phpとかも動いてたんですけどねぇ…。
Premature end of script headersをGoogleで検索してみると、まあ、それなりにHitします。
参考:http://www.google.com/search?hl=ja&q=Premature+end+of+script+hea&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
で、どこも口を揃えて言っているのが、
- Premature end of script headersとは、ApacheがCGIに対して、「HTTPヘッダーがおかしいぞ!」といっている結果エラーである。原因は表していない。
- CGIの先頭の#!/usr/bin/perlが実在のperlとあっていないと発生する。
- perl5.8以降のUnicodeサポートの関係で、文字化けしているとヘッダーを理解できなくて出る。
- #!/usr/bin/perlの後に「--」をつけると出なくなる
- CGIの最初のほうで「Content-: text/html\n\n」を書く前に何か他のものを出力してしまっている。もしくは出力していない。
- Apache2.0は安定していないので使わないほうがいい。Apache1.3系に戻したら出なくなった。
なぁ〜んてレベルのまじないレベル。(汗)
でも、他にHitしなかったのでその辺を丹念に調べていたのですが…。
という事に気が付いた。
そっか! suExecかぁ!!!
そういえば./configureするときに「--enable-suexec」って入れてあったよ!
そうと決まればここを見る。
http://httpd.apache.org/docs/2.0/ja/suexec.html
これによると、suexecはセキュリティーの為に実行ユーザのUIDやGIDが設定した値よりも大きいかとか、実行されるCGIのディレクトリがOtherとGroupに対して書込み禁止にしてあるかとか、実行するCGIでOtherの実行権限がONになっていないかだとか、イロイロ調べており、その結果、suexecで実行する条件を満たしていない場合は「Premature end of script headersになる場合が多い」らしい。
……すんません、全くノーマークでした<suexec
んだもんで、今回の場合はたまたま./configureで--with-suexec-logfile=xxxxしてあったので、suexecの失敗Logが出ていましたよ。
曰く、
uid: (1014/hakoniwa) gid: (500/500) cmd: test.cgi directory is writable by others: (/xxxxxxxxx/hakoniwa/public_html/cgi-bin) → ディレクトリがOtherから書き込める権限だからダメだよ
とか、
uid: (1000/sakatuba) gid: (10/10) cmd: index.cgi cannot run as forbidden gid (10/index.cgi) → GIDがsuexecをコンパイルした時の設定より小さいからダメだよ
とか、
ボロボロ出ておりました。
注目すべきは、この辺のsuexecの事情は普通のerror_logには全く出てこないのです。
ただ「Premature end of script headers」とだけ出てくるわけです。
(そりゃぁ、そうだよね。suexecできないんだから「できねえよ!」ってエラーメッセージかダンマリかのどちらかなんだから、HTTPヘッダーのわけが無い。)
ってなわけで、Premature end of script headersの理由を知りたい方、是非suExec周りをチェックしてみてください。
perlのCGIに無駄なbinmode〜を書いたり、use encoding;やuse Encode;のかたまりを書くよりもよっぽど早く原因にたどり着けます。
さ、あとは新しいDNS情報が日本まで浸透してくるのを待つばかりだな(爆)