nginx
我正在运行 Ubuntu 15.04,并且正在运行( )的标准安装apt-get install nginx
。
一切运行正常,但我注意到nginx
日志正在轮换,但nginx
继续输出到同一个日志文件,例如,该文件/var/log/nginx/error.log
是空的,但/var/log/nginx/error.log.1
正在写入内容。
当然,如果我重新启动,nginx
常规日志文件就会开始写入。logrotate
脚本中是否存在错误?是否需要nginx
在旋转时重新启动?
答案1
您正在运行 Ubuntu 版本 15。
是的,你可以logrotate
像其他答案一样随意摆弄脚本片段。但是你正在运行 Ubuntu 版本 15. 在您的操作系统上,服务在 systemd 下运行,它默认情况下error.log
捕获其标准错误和系统日志输出并处理日志记录。nginx 无需首先写入该文件。无需logrotate
根本。
其他答案及其下面的评论可能会让您考虑/etc/init.d/nginx
一下。不要。该文件不相关。 你正在运行 Ubuntu 版本 15。相关文件(在 Ubuntu nginx-common 包中开箱即用)是/lib/systemd/system/nginx.service
systemd 将要使用的文件,完全忽略/etc/init.d/nginx
被适当的 systemd 服务单元文件完全覆盖的旧文件。
其他答案也可能会引导你去思考/etc/logrotate.d/nginx
。你可能会对以下矛盾感到困惑:你可以清楚地看到,尝试使用rc
非标准invoke-rc.d
子命令运行旧的 System 5 脚本,并声称没有postrotate
节。但同样,不要这样做。首先不要关注这些 logrotate 控制节。 你正在运行 Ubuntu 版本 15使用已经具有系统单元且未rc
在您的操作系统上使用 System 5 脚本的软件包,以及记录服务输出的服务管理器。
按照 systemd 方式做事有两个步骤:
更加适当地配置nginx。
您的nginx
服务只需被告知将其日志写入其标准错误即可。作为奖励,您可以通过 syslog 将您的访问日志发送到日志,systemd 也会拦截它。
这是通过nginx 全局配置指令和 http 模块指令。具体来说:
error_log stderr ;
access_log syslog:server=unix:/dev/log ;
您可以更改nginx.conf
文件以将其更改为这个人做了什么,或者做了亚历山大·库兹涅科夫在这里并更改您的nginx.service
单元文件以在nginx
命令行上传递(全局)指令:
类型=分叉 PID文件=/运行/nginx.pid ExecStart=/usr/bin/nginx -g'守护进程开启;error_log stderr;master_process 开启;'
彻底忘记logrotate
吧。
systemd 将所有服务的标准输出和标准错误放入其日志中。它自己处理日志文件的轮换。完全不涉及信号,也不涉及 nginx 服务重新加载。您可以使用以下命令读取日志中与服务相关的最后几个条目(以超级用户或用户身份运行adm
)
systemctl 状态 nginx.service您可以使用以下命令读取该服务自上次启动以来的日志中的所有内容
journalctl -u nginx.service -b
答案2
原因nginx
是写入旋转文件时文件postrotate
中缺少用于重新加载配置的部分。logrotate
nginx
nginx
logrotate
确实重命名了文件,但重命名不会关闭或更改文件描述符(内核内部维护一个描述符表,该表通过文件句柄或描述符显示所有打开的文件),文件句柄仍与以前相同。因此,该nginx
过程将继续转储到相同的文件句柄(旋转的句柄),而不是新创建的文件。
为了解决这个问题,postrotate
在配置文件中添加一个部分logrotate
以重新加载配置文件nginx
。
例如,以下是postrotate
部分/etc/logrotate.d/apache2
:
postrotate
if /etc/init.d/apache2 status > /dev/null ; then \
/etc/init.d/apache2 reload > /dev/null; \
fi;
endscript
答案3
创建包含以下内容的文件 /etc/logrotate.d/nginx。至少在 debian 上有效。您的情况可能有所不同
/var/log/nginx/*.log {
daily
missingok
rotate 99
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}