SELinux が有効だと cgi の実行で Internal Server Error になった

ALL
スポンサーリンク

とあるテストサーバ上で、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

コメント