Linux

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

  • August 27, 2020

我對任何告訴 nginx 使用新日誌文件的命令都有問題。我正在使用 Ubuntu 18.04、nginx/1.14.0、logrotate 3.11.0

如果我手動或通過 logrotate 在 /var/log/nginx 中創建新文件access.logerror.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

引用自:https://serverfault.com/questions/1031715