我遇到任何告诉 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
文件位于正确的位置。
我能够让日志轮换正常工作的唯一方法是通过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 命令)