最近在做基于openresty的waf,在测试openresty的过程中用openresty替代了原nginx,结果第二天又自动切换回了原nginx,通过ps -ef 看到nginx在凌晨3点多自动重启。连续几天在多个机器上都发现同样的情况。
刚开始我以为是以前的运维在crontab里配置里什么自动重启nginx的定时任务,然而crontab -l 并没有发现什么任务,同时我还发现nginx的日志是有做切割的,nginx log日志每天会自动切割压缩保存三天。这一发现让我更纳闷了,然后就在机器里筛选各种脚本都没有发现有做日志切割的,但是像这种动作明显还是通过类似定时任务做出来的。难道是之前运维在其他机器上有做远程执行脚本?心里还想真如果是这样,那这坑还真挖的深。经过一番查找然而还是没有。。。
左思右想,,,还是觉得nginx的莫名重启和日志分割是分不开的,在网上查找nginx日志分割发现都是通过脚本做的分割,但是之前服务器里并没有这样的脚本。我就觉得很有可能和nginx本身有关系了,然后就换了办法搜索,“nginx log 默认压缩日志”, 好吧,还真找到了。还是定时任务的原因。
因为Nginx在安装时加入了一个logrotate任务: /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Linux日志管理服务logrotate会定时读取该文件,根据设置按日志大小或天数删除/归档旧日志,创建新日志.
配置说明:
daily: 日志文件每天进行滚动
missingok: 如果找不到这个log档案,就忽略过去
rotate: 保留最进52次滚动的日志
compress: 通过gzip压缩转储以后的日志
delaycompress: 和compress一起使用时,转储的日志文件到下一次转储时才压缩
notifempty 如果是空文件的话,不转储
create mode owner group:转储文件,使用指定的文件模式创建新的日志文件
sharedscripts: 运行postrotate脚本(该脚本作用为让nginx重新生成日志文件)
postrotate/endscript: 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
logrotate默认被加入到cron的/etc/cron.daily中作为每日任务执行,配置定义在:
/etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
查看logrotate最近进行了哪些日志归档。