我在使用任何告訴 nginx 使用新日誌檔案的命令時遇到問題。我正在使用 Ubuntu 18.04、nginx/1.14.0、logrotate 3.11.0
如果我在 /var/log/nginx 中建立新的access.log
或error.log
文件,無論是手動還是透過 logrotate,它們都不會被使用,而是服務使用舊的日誌檔案(我已將其重命名為用於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 的內容(我們在 nginxconf 中使用自訂命名日誌):
-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::---
答案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,並可能根據需要變更或新增一行(man dpkg-statoverride)