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

それは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業者なので、コレを言うとまた沈静化した問題が燃え上がってしまうので、今回は言わないようにしよう(笑