Nginx でログファイルの再オープンで失敗する場合の対応は
以前に、「Nginx のログをログローテーションに対応させるには」で ログローテーション ( logrotate ) のnginx 対応について簡単に解説しました。
そのログローテーション ( logrotate ) で、
kill -USR1 `cat /var/run/nginx.pid`
|
を用いることを解説しました。
これが、なぜか、1.0.10 で以下のようにエラー出力されうまく動作しなくなりました。
2011/11/27 10:10:29 [emerg] 16533#0: open() "/var/log/httpd/access.log" failed (13: Permission denied)
|
その原因と対処について、今回は、解説してみます。
- 目次
- 履歴
2011年11月28日 初版
2013年5月16日 目次追加
エラーの詳細を確認し、対処してみる
2011/11/27 10:10:29 [emerg] 16533#0: open() "/var/log/httpd/access.log" failed (13: Permission denied)
|
上記のエラーの意味は、
/var/log/httpd/access.log をファイルオープンしようとしましたが権限がありません。
ぐらいの意味あいです。
ですから、
kill -USR1 `cat /var/run/nginx.pid`
|
のコマンドは、ちゃんと機能していて、ログファイルの再オープンをしようとしたが、失敗したことになります。
単純に先のファイルオープンの権限が無いので、
chmod 777 /var/log/http/*
|
で同じように
kill -USR1を実行しても同様の結果でした。
そこで色々と調べてみると、ちょっと不可解な点も見えてきました。
一つは、
/var/log/nginx/error.log は、ちゃんと再オープンできているのに、
/var/log/httpd/access.log は、再オープンできないでいる点です。
このことから、わかる方は既におわかりのとおり、各ディレクトリの権限を調べてみると、
$ ls -l /var/log/
...
drwx------ 2 root root 282624 11月 27 10:08 httpd
...
drwxr-xr-x 2 root root 4096 11月 25 14:32 nginx
...
|
思ったとおり、ディレクトリの権限に違いがありますね。
このことから、ディレクトリのアクセス権限を与えてやるか、オーナー(所有者)を変更すれば良いはずですね。
ここでは、権限を変更してみます。
$ chmod 755 /var/log/httpd/
|
これで、再度、同じようにkill -USR1を実行すると、やっとうまくいきました。
なんという初歩的な見落としでしょ。
わかってみるとたいした話ではないのですが、apacheで使っていたディレクトリをそのまま使用した点に、ちょっとした盲点があったんでしょうね。言い訳です。
nginx の以前のバージョン1.0.4では、何も問題なく動作していたのも、
nginx の1.0.10であっても、
再起動するとちゃんとログファイルをオープンでき、ログの出力もできてしまう点も 少し原因究明を混乱させてしまった要因かもしれません。
nginx が同じ動作(常にオープンエラー)をしてくれればわかりやすかたんですけど、
nginx のmaster processはrootで動作しているでしょうから、再起動すれば、そのroot権限で開けていた?のかなぁ・・・と想像の域をでませんが、何はともあれ、
設定の誤りに違いはありません。
apacheからnginxへ移行された方で、同じ失敗をされている方もいらっしゃるかもしれませんので、あえて記事にしてみました。
そんな方の助けになればうれしく思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :