悩まされ続けたエラー

一ヶ月ほど前に、どうしても解決できなくて一晩明かしたエラーがありました。

それはApache2でCGIを動かそうとすると
Internal Server Error:500」
になるというもの。


で、コレだけじゃ原因はわからないので、Apacheのログを見ると
「Premature end of script headers: test.cgi」
みたいなエラーが出ています。


これを検索かけると、いくつか原因と「コレで解決した」という情報が出てきます。
1.ファイル転送モードの間違い
FTPソフトなどでBinaryモードではなくASCIIモードで送ると解決
2.FTPサーバ側がASCIIモードに対応していない
vsftpを使っている場合はvsftpd.confに以下を設定で解決
ascii_upload_enable=YES
ascii_download_enable=YES
3.文字コードが間違い
EUCにすると解決
4.改行コードの違い
WindowsではCR+LFですが、UNIXではLFなので改行コードを修正するか
#! /usr/bin/perl --
~~
とハイフンを2つ入れることで解決
5.perlのパスが違っている。
正しく設定しましょう。
6.Apache2をやめる
Apache1.3をインストールする。


とこんな感じです。
しかし..「Apache1.3を入れる」以外は全部やってみましたが、やっぱり動きませんでした。


テスト等でいろいろ弄っていたのでサーバが壊れたのかと思っていたのと、
動かすことが最優先だったので、とりあえずサーバを再インストールすることになりました。


サーバを入れなおしてから、特に連絡がなかったため、てっきり動いているものかと思いましたが、今日連絡があって「また動かない...」ということ。


早速調査を開始。



とりあえず上記の情報がさらっとでてきて、試してみるもやっぱりNG。
その後、見つけたページ
404 Not Found

suexec サポートプログラムは バーチャルホストやユーザのホームディレクトリの場所に依って CGI プログラムを違うユーザ権限の下で走らせることを可能にします。 Suexec の権限のチェックは非常に厳しく、それを満たさない場合は CGI プログラムが Premature end of script headers エラーで 実行されません。

とありました。


SUEXECでCGIが動いていることは確認していたのでSUEXECのログを確認
Apacheのログと同じところ /var/log/httpd/ にありました。


そこには...
「directory is writable by others: ...」
とありました。



ディレクトリが書き込み可能だとNG?
そこで思い浮かんだのが上記ページの"Suexec の権限のチェックは非常に厳しく..."という部分。


404 Not Found
こちらに、

16.対象となる CGI/SSI プログラムファイルが他アカウントから 書き込めるようになっていないか?
 所有者以外には CGI/SSI プログラムを変更する権限は与えられません。

とありました。


とりあえず、CGIが格納されているディレクトリを見ると、確かにOtherに書き込み権限が与えられている。ログファイル追加するため書き込み権限がついているようです。


これを外して、対象のCGIもchmod 700で設定したところ...






キタワァ━━━━━━(n‘∀‘)η━━━━━━ !!!!!





って感じでバッチリ動きました。


しかし...SUEXECで動作していることは、一昔前の人間にとっては予想もしないところで引っかかりそう...

suexec を完全に理解していない限り、使うべきではありません。


とか

suEXEC を Apache のデフォルトインストールには含めないことが Apache グループで決定されています。これは、suEXEC の設定には管理者の詳細にわたる慎重な注意が必要だからです。


なんて記載されています。
まぁ「使うことにメリットはあるが、十分理解して使ってね」ってことなのでしょう。


まぁひとまず動作したのでOKですが、ホスティングされたレンタルサーバなので、SUEXECが適用されているかは一言連絡をもらいたかった..という感じです。


これって結構ひっかかる人いると思うのですが、どうなんでしょうかね?



まぁ、今回のサーバはサポート窓口が顧客に対してキレるようなDQN業者なので、コレを言うとまた沈静化した問題が燃え上がってしまうので、今回は言わないようにしよう(笑