nginx に新しいログファイルを使用するように指示するコマンドで問題が発生しています。Ubuntu 18.04、nginx/1.14.0、logrotate 3.11.0 を使用しています。
手動または logrotate 経由で /var/log/nginx に新しいファイルaccess.log
またはerror.log
ファイルを作成した場合、それらは使用されず、代わりにサービスは古いログ ファイルを使用します (access.log.1
このテストでは、logrotate の動作をシミュレートするために名前を変更しました)。
次のコマンドを(個別に)試しました。いずれもエラー メッセージは表示されず、すべて期待どおりの出力が生成されます。ただし、nginx は古いログの使用を停止しません。
service nginx rotate
invoke-rc.d nginx rotate
kill -USR1 `cat /var/run/nginx.pid`
.pid
上記のファイルが正しい場所にあることも確認しました。
ログ ローテーションを機能させる唯一の方法は を使用することです。service nginx reload
これは機能しますが、構成ファイルも再読み込みします。再読み込みではダウンタイムが発生しないことはわかっていますが、再読み込みはできるだけ少なくしたいので、機能させたいのですservice nginx rotate
。
これは の権限の問題によるものであることはほぼ確実です/var/log
。最近、ログファイルに安全な権限があることを確認するための cronjob を設定しました。これは監査のためであり、ペンテスト会社がログに関するさまざまなセキュリティ対策を提案したためです。設定した cronjob は起動時に実行されます。
#!/bin/bash
setfacl -Rm u::rwx,g::r--,o::--- /var/log
find /var/log -type f -exec chmod g-wx,o-rwx "{}" + -o -type d -exec chmod g-w,o-rwx "{}" +
chmod g+wx /var/log
chown -R www-data:adm /var/log/nginx
cronjob を実行した後の関連ディレクトリとファイルの権限は次のとおりです。
/var/log ディレクトリ自体:
drwxrwx--- 14 root syslog 4096 Aug 27 10:01 log
/var/log/nginx ディレクトリ自体:
drwxr----- 2 www-data adm 4096 Aug 24 02:25 nginx
/var/log/nginx の内容 (nginx conf でカスタム名のログを使用します):
-rwxr----- 1 www-data adm 0 Aug 24 02:24 access.log
-rwxr----- 1 www-data adm 108 Aug 24 02:24 error.log
-rwxr----- 1 www-data adm 49317 Aug 27 10:11 x3nr0s.access.log
-rwxr----- 1 www-data adm 798 Aug 27 10:02 x3nr0s.error.log
(verbosely)を実行するかlogrotate --force /etc/logrotate.d/nginx -v
、手動でtouch
新しいファイルを作成すると、640 の権限で作成されます(logrotate の設定ファイルによる)。私が読んだところによると、640 で十分です。
-rwxr----- 1 www-data adm 0 Aug 24 02:24 access.log
-rw-r----- 1 www-data adm 0 Aug 27 10:13 error.log
-rwxr----- 1 www-data adm 1972 Aug 27 10:13 error.log.1
-rw-r----- 1 www-data adm 0 Aug 27 10:13 x3nr0s.access.log
-rwxr----- 1 www-data adm 51521 Aug 27 10:13 x3nr0s.access.log.1
-rw-r----- 1 www-data adm 0 Aug 27 10:13 x3nr0s.error.log
-rwxr----- 1 www-data adm 798 Aug 27 10:02 x3nr0s.error.log.1
ご覧のとおり、新しいファイルは空のままで、ログは古いファイルに継続されます。また、詳細な logrotate 出力も確認しましたが、postrotate セクションに関してはすべて正常に動作しているようです。(これは を実行しますinvoke-rc.d nginx rotate
。前述したように、このコマンドは何もローテーションしないようです...)
最後のテストとして、ユーザーに新しいファイルへの実行権限を与えて、 を実行しましたservice nginx rotate
。それでも、nginx は古いファイルを使用します。他の回答では、ディスク領域がいっぱいかどうかを確認するように言及されています。いっぱいではありません。
これについてご支援いただければ幸いです。ありがとうございます。
詳細情報
私の /etc/logrotate.d/nginx の設定は次のとおりです:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
前述のように、logrotate と nginx を新しいログ ファイルで正しく動作させる唯一の方法は、postrotate
セクションを に置き換えることですservice nginx reload
。
出力は次のとおりですps -ef | grep nginx
:
root 1367 1 0 10:45 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 1368 1367 0 10:45 ? 00:00:00 nginx: worker process
www-data 1369 1367 0 10:45 ? 00:00:00 nginx: worker process
www-data 1370 1367 0 10:45 ? 00:00:00 nginx: worker process
www-data 1371 1367 0 10:45 ? 00:00:00 nginx: worker process
root 15247 14835 0 11:19 pts/0 00:00:00 grep --color=auto nginx
getfacl
/var/log に次のように出力されます:
# file: var/log
# owner: root
# group: syslog
user::rwx
group::rwx
other::---
getfacl
/var/log/nginx には次のように出力されます:
# file: var/log/nginx
# owner: www-data
# group: adm
user::rwx
group::r--
other::---
答え1
は/etc/logrotate.d/nginx
デフォルトのものであり、機能するはずです。
ただし、postrotate.d
コマンドを変更して、nginxに強制的に設定を再読み込みさせ(新しいログファイルを使用するようにする)
service nginx reload >/dev/null 2>&1
すぐに解決できるかもしれません。
通常動作しているサービスがファイルを作成/開く/名前変更/変更できない場合、多くの場合、アクセス権が関係しています。
ここではアクセスが変更されています (セキュリティのため) が、デフォルトの ACL も機能し、安全であるはずです。setfacl
これは強力ですが、デフォルトのオプションを使用するとすぐには表示されませんls
。
デフォルトのACLは、/var/log
drwxrwxr-x 18 root syslog 4096 Aug 27 07:25 /var/log/
そしてデフォルトのnginxは(実際は)
drwxr-x--- 2 www-data adm 4096 Aug 27 07:25 /var/log/nginx/
nginx
大丈夫ですが、/var/log
もう少しきつくてもよいかもしれません
drwxrwx--x 18 root syslog 4096 Aug 27 07:25 /var/log/
others
ディレクトリ(およびそれ以下)へのアクセスは許可するが、コンテンツの一覧表示は禁止します。
facl に関しては、コマンドは、、およびgetfacl
に実際に追加された ACL をリストし/var/log
、問題が明らかになる可能性があります。/var/log/nginx
/var/log/nginx/*
ちなみに、
dpkg-statoverride --list
アップデートまたはインストール後にインストーラが設定するACLを確認し、必要に応じて行を変更または追加します(dpkg-statoverride コマンド)