NGINXサービスローテートは新しいログファイルを使用しません

NGINXサービスローテートは新しいログファイルを使用しません

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 コマンド

関連情報