NGINX 服务 rotate 不使用新的日志文件

NGINX 服务 rotate 不使用新的日志文件

我遇到任何告诉 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文件位于正确的位置。

我能够让日志轮换正常工作的唯一方法是通过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 配置中使用自定义命名的日志):

-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命令将列出实际添加的/var/log/var/log/nginx和的 ACL /var/log/nginx/*,这可能会揭示问题。

顺便说一下,

dpkg-statoverride --list

检查安装程序在更新或安装后将设置哪些 ACL,并根据需要更改或添加一行(dpkg-statoverride 命令

相关内容