logrotate 可自动管理 Nginx 日志轮转与清理,配置简单可靠;默认已安装并定时运行,通过 /etc/logrotate.d/nginx 配置 daily、rotate 30、compress 等参数,并用 postrotate 通知 Nginx 重开日志。

可以通过 logrotate 工具自动管理 Nginx 日志的轮转与过期清理,无需手动脚本,配置简单且稳定可靠。
确认 logrotate 是否已安装并启用
大多数 Linux 发行版(如 CentOS、Ubuntu)默认已安装 logrotate,并通过 systemd 或 cron 定期运行(通常是每天一次)。可执行以下命令验证:
- sudo logrotate --version —— 查看版本
- sudo systemctl list-timers | grep logrotate(systemd 系统)或 crontab -l | grep logrotate(sysv/cron 系统)—— 查看是否启用定时任务
配置 Nginx 日志的 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 个归档日志(即最多保留 30 天),超出的自动删除
- compress:对归档日志启用 gzip 压缩(.gz)
- delaycompress:延迟压缩,最新一轮不压缩,便于调试
- postrotate ... endscript:通知 Nginx 重新打开日志文件,避免服务中断写入
手动触发并验证效果
配置完成后,建议先手动运行一次测试:
- sudo logrotate -f /etc/logrotate.d/nginx —— 强制执行一次轮转
- ls -lt /var/log/nginx/*.gz —— 检查是否生成新归档
- ls -lt /var/log/nginx/ | head -n 40 —— 查看总数是否被限制在预期范围内(如 ≤31 个文件:当前日志 + 30 归档)
注意:rotate 数值控制的是归档文件数量,不是天数本身;若日志不是每天轮转(比如设为 weekly),则实际保留时长会变化。
替代方案:用 find 配合 cron(仅作补充)
若因特殊原因无法使用 logrotate(如容器环境无 systemd),可用 find 命令定期清理:
- 添加定时任务:0 2 * * * find /var/log/nginx/ -name "*.log.*" -mtime +30 -delete
- 注意:-mtime +30 表示“修改时间超过 30 天”,需确保归档文件的 mtime 正确(logrotate 默认保持原日志时间戳,该方式兼容)
- 建议先用 -print 替代 -delete 测试匹配结果
不复杂但容易忽略细节,推荐优先使用 logrotate。它专为日志生命周期管理设计,比自写脚本更健壮、可审计、易维护。


















