写在前面

我发现每次只要日志被压缩一遍之后,nginx 就不会再记录访问和错误日志了。

原因定位

  1. 查看/var/log/cron日志,发现在日志被压缩时执行了一个定时任务
    Apr 21 19:10:01 izj6cf5t207ddaqhc1e75vz CROND[1742]: (root) CMD (/usr/lib64/sa/sa1 1 1)
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz anacron[1662]: Job `cron.daily' started
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz run-parts(/etc/cron.daily)[1746]: starting logrotate
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz run-parts(/etc/cron.daily)[1760]: finished logrotate
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz run-parts(/etc/cron.daily)[1746]: starting man-db.cron
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz run-parts(/etc/cron.daily)[1771]: finished man-db.cron
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz anacron[1662]: Job `cron.daily' terminated
    Apr 21 19:15:01 izj6cf5t207ddaqhc1e75vz anacron[1662]: Normal exit (1 job run)
  2. 查阅资料后发现logrotate是一个用来切割压缩日志的工具。主配置文件/etc/logrotate.conf,配置目录/etc/logrotate.d
  3. 进入配置目录查看 nginx 的配置
    cd /etc/logrotate.d
    less nginx
  4. 配置如下
    /var/log/nginx/*log {
     create 0664 nginx root
     daily
     rotate 10
     missingok
     notifempty
     compress
     sharedscripts
     postrotate
         /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
     endscript
    }
  5. 发现每次压缩完日志后确实都会重新发送USR1信号给nginx。
  6. less /etc/nginx/nginx.conf
  7. 发现一行pid /usr/local/nginx/logs/nginx.pid;
  8. nginx.pid的路径和/etc/logrotate.d中的路径不一样。

原因就是nginx.pid文件路径不一致导致信号无法发送给nginx进程,从而导致没有日志记录。

解决方法

  1. less /etc/logrotate.d
  2. 查看postrotatekill命令中nginx.pid的路径
  3. less /etc/nginx/nginx.conf
  4. 寻找一行pid xxxx/nginx.pid
  5. 修改这一行保证两个文件内的nginx.pid文件的路径一致
  6. systemctl restart nginx