NGINX 服務輪換不使用新的日誌文件

NGINX 服務輪換不使用新的日誌文件

我在使用任何告訴 nginx 使用新日誌檔案的命令時遇到問題。我正在使用 Ubuntu 18.04、nginx/1.14.0、logrotate 3.11.0

如果我在 /var/log/nginx 中建立新的access.logerror.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

相關內容