とあるテストサーバ上で、apache で cgi を動作させようとしましたが、ブラウザからアクセスすると Internal Server Error になり、どうやっても動作出来なくなっていました。
/var/log/httpd/error_log には下記のような出力がされていますが、さっぱり原因がわかりませんでした。
(13)Permission denied: exec of '/usr/local/test/cgi-bin/test.cgi' failed Premature end of script headers: xxxxx.cgi
ところが、下記情報を見つけて問題解決できました。
EZ-NET: パーミッションを正しく設定しても CGI の実行に失敗する場合 (CentOS 5.4)
apache のデフォルトの cgiディレクトリ以外の場所に cgi を置くと、いくら apache の設定を正しくしても、SELinux が有効になっているとエラーとなるようです。
getenforce コマンドを実行して、下記のように Enforcing と表示されたら、SELinux が有効になっています。
nbsp;getenforce Enforcing
試しに下記コマンドで一時的に SELinux を無効にすると、Internal Server Error にならずに正常に cgi が実行できました。
setenforce 0
さて、SELinux が有効な場合は、SELinux の設定を行う必要がありますが、私はこれまで、SELinux を無効にしていました。
今回も SELinux を無効にする為に、下記を設定しました。
/etc/sysconfig/selinux
SELINUX=disabled
ここで間違えて SELINUXTYPE=disabled としないように注意して下さい。
カーネルパニックで起動しなくなってしまいます。
これまで私は SELinux を無効にしていたのですが、今回、テストサーバでその無効化を忘れ、 Internal Server Error にかなり悩まされてしまいました。
ただし、今後は SELinux を無効化せずに有効にしてサーバを運用できるようにする必要があると思います。
参考
EZ-NET: パーミッションを正しく設定しても CGI の実行に失敗する場合 (CentOS 5.4)
SELinuxを無効化する | Smart
12 Tips
コメント