您正在运行 Ubuntu 版本 15。

您正在运行 Ubuntu 版本 15。

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.servicesystemd 将要使用的文件,完全忽略/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中缺少用于重新加载配置的部分。logrotatenginxnginx

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
}

相关内容