用 logrotate 实现 Nginx 日志按天自动归档,需配置 /etc/logrotate.d/nginx,设置 daily、rotate 30、compress、create 及 sharedscripts postrotate 发送 kill -USR1 信号,并验证 cron 每日执行。

用 logrotate 实现 Nginx 日志按天自动归档,核心是配置好 logrotate 规则,并确保它能正确触发 Nginx 重载日志(即通知 Nginx 关闭旧日志文件、打开新文件),避免日志写入中断或丢失。
确认 Nginx 日志路径和权限
logrotate 需要能读取并重命名日志文件,同时需有权限向 Nginx 发送信号。通常 Nginx 日志位于 /var/log/nginx/access.log 和 /var/log/nginx/error.log。确保 logrotate 运行用户(一般是 root)对这些路径有读写权限,且 Nginx 主进程由 root 启动(这样才能接收 kill -USR1 信号)。
编写 logrotate 配置文件
在 /etc/logrotate.d/nginx 中创建配置(无需修改主配置):
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
说明:
• daily:每天轮转一次
• rotate 30:保留最近 30 个归档文件
• compress + delaycompress:压缩上一轮日志(本次轮转不压,下次才压),方便排查刚切完的问题
• create 0644 www-data www-data:新建日志文件时设权限和属主(根据实际 worker 进程用户调整,常见为 www-data 或 nginx)
• sharedscripts + postrotate/endscript:所有匹配日志统一执行一次脚本,发送 USR1 信号让 Nginx 重新打开日志文件
验证配置并手动测试
运行以下命令检查语法是否正确:
logrotate -d /etc/logrotate.d/nginx
加 -d 是调试模式,只打印动作不真实执行。确认无报错后,用 -f 强制执行一次:
logrotate -f /etc/logrotate.d/nginx
执行后检查:
• 原日志是否被重命名为 access.log.1(或带日期后缀,取决于配置)
• 是否生成了新的 access.log,且权限/属主正确
• tail -f /var/log/nginx/access.log 是否仍有新请求写入(说明 USR1 生效)
确认 cron 定时任务已启用
logrotate 默认由系统 cron 每天执行(通常通过 /etc/cron.daily/logrotate)。检查是否存在且可执行:
ls -l /etc/cron.daily/logrotate
如未启用,可手动添加定时任务(不推荐覆盖默认方式),例如:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/nginx
但更稳妥的做法是依赖系统级 daily 任务,并确保 /etc/logrotate.conf 中包含 include /etc/logrotate.d 且未被注释。


















