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
文件在正確的位置。我能夠讓日誌輪換工作的唯一方法是通過 a
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
如果我們執行
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::---
這
/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,並在必要時更改或添加一行(man dpkg-statoverride)