一般来说,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,会发现有以下一行不是很明显的报错日志,但这只说明退出码错误。
有没有更详细的的呢?有!这样的操作,一般都会发到root的系统mail邮箱中。我们查看一下/var/spool/mail/root,里面记录了更加详细的内容,如下图。
根据上图,明显可以看到是因为权限不足的原因导致的,这时候我们首先排查的就是相应目录和文件的rwx权限。
权限正常呀?那怎么还会提示权限不足的问题呢!?
这时候,我们不要忘了,Linux系统对权限的控制,还有另外一种 selinux 。
然后我们查看一下系统的审计日志内容, /var/log/audit/audit.log
果然,我们可以看到下图中对logrotate的 deny限制,说明,正是selinux导致的。
对以上的解决方法无非两种,关闭selinux或者给文件、目录授权相应的selinux策略。
那我们再想想,为什么rpm包安装的nginx没有这样的问题呢?那肯定是因为安装的时候已经配置了。
好,那我们下载一个rpm的安装包瞧一瞧。
解包后,我们在\opt\rh\rh-nginx120\register.d\路径下可以看到90.XXXXX.run的文件,打开里面的内容,就可以找到我们的解决方法。
所以,接下来我们配置
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可以选择的类型非常多。