一般来说,linux通过rpm安装的nginx都自带有日志轮替的配置,所以并不会导致单个日志过大的问题。但如果我们通过自编译来部署nginx,是需要自行配置的。日志轮替的原理就是利用linux的logrotate工具进行,我们现在直接参考rpm安装的logrotate配置文件来进行配置,内容如下

/var/opt/rh/rh-nginx120/log/nginx/*log {
    create 0644 root root
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/opt/rh/rh-nginx120/log/nginx/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

将以上内容放到/etc/logrotate.d/ 目录下。

然而,第二天你会发现,日志并没有被归档?

让我们看一下日志/var/log/messages,会发现有以下一行不是很明显的报错日志,但这只说明退出码错误。

nginx upsream 打印转向日志 nginx日志轮转_运维

有没有更详细的的呢?有!这样的操作,一般都会发到root的系统mail邮箱中。我们查看一下/var/spool/mail/root,里面记录了更加详细的内容,如下图。

nginx upsream 打印转向日志 nginx日志轮转_解决方法_02

根据上图,明显可以看到是因为权限不足的原因导致的,这时候我们首先排查的就是相应目录和文件的rwx权限。

nginx upsream 打印转向日志 nginx日志轮转_linux_03

权限正常呀?那怎么还会提示权限不足的问题呢!?

这时候,我们不要忘了,Linux系统对权限的控制,还有另外一种 selinux 。

然后我们查看一下系统的审计日志内容, /var/log/audit/audit.log

果然,我们可以看到下图中对logrotate的 deny限制,说明,正是selinux导致的。 

nginx upsream 打印转向日志 nginx日志轮转_运维_04

对以上的解决方法无非两种,关闭selinux或者给文件、目录授权相应的selinux策略。

那我们再想想,为什么rpm包安装的nginx没有这样的问题呢?那肯定是因为安装的时候已经配置了。

 好,那我们下载一个rpm的安装包瞧一瞧。

解包后,我们在\opt\rh\rh-nginx120\register.d\路径下可以看到90.XXXXX.run的文件,打开里面的内容,就可以找到我们的解决方法。

nginx upsream 打印转向日志 nginx日志轮转_linux_05

nginx upsream 打印转向日志 nginx日志轮转_运维_06

 所以,接下来我们配置

semanage fcontext -a -e /var/log/nginx /var/opt/rh/rh-nginx120/log/nginx

restorecon -R /var/opt/rh/rh-nginx120/log/nginx

 OK,这下就彻底解决nginx日志轮替的问题。

关于selinux的问题延伸一下:

首先需要selinux的一些基础知识,然后我们往下看。

关于/var/log/nginx的selinux的rule我们可以看一下,其 type为 httpd_log_t ,那么我们是否必须将nginx的log的selinux的type类型设置为  httpd_log_t 呢?

并不一定,这个涉及到selinux中的原理,我们可以简单的通过工具看

sealert -a audit.log

通过这个命令可以分析相应的日志并给出对应的建议,通过以上命令我们可以看到一些结果,重点关注标红的那一部分,可以看出FILE_TYPE可以选择的类型非常多。

nginx upsream 打印转向日志 nginx日志轮转_解决方法_07