用logrotate配置Nginx日志轮转最稳妥,支持轮转、压缩、清理及通知Nginx重开日志;需确认日志路径、运行用户和pid文件位置,正确编写/etc/logrotate.d/nginx配置并验证生效。

直接用 logrotate 配置是最稳妥的方式,它原生支持轮转、压缩、清理和通知 Nginx 重开日志,无需额外脚本或 crontab。
确认日志路径与权限
先查清 Nginx 实际使用的日志位置和运行用户:
- 运行 nginx -T | grep "access_log\|error_log" 查看配置中定义的日志路径(常见为 /var/log/nginx/*.log 或 /usr/local/nginx/logs/*.log)
- 用 ps aux | grep nginx 确认主进程用户(如 www-data、nginx 或 root),后续 create 指令需匹配该用户和组
- 检查 pid 文件路径:ls /var/run/nginx.pid 或 ls /usr/local/nginx/logs/nginx.pid,postrotate 中 kill 命令依赖这个路径准确
编写标准配置文件
在 /etc/logrotate.d/nginx 创建配置(推荐用 sudo 编辑):
- /var/log/nginx/*.log { ← 替换为你真实的日志路径
- daily ← 每天触发一次轮转(也可换为 weekly 或 size 100M)
- missingok ← 日志临时缺失不报错
- rotate 30 ← 最多保留 30 个归档文件(不是 30 天,实际保留时长取决于日志生成频率)
- compress ← 用 gzip 压缩旧日志
- delaycompress ← 当前轮转出的 .log.1 先不压缩,方便快速查看;下次轮转时再压缩它
- notifempty ← 空日志不轮转,避免无意义归档
- create 0640 www-data adm ← 新日志权限 640,属主 www-data,属组 adm(按你系统实际用户/组调整)
- sharedscripts ← 所有匹配日志处理完后,只执行一次 postrotate
- postrotate
- [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
- endscript
- }
验证与启用
配置写完别急着等 cron,立刻手动测试是否生效:
- 运行 logrotate -d /etc/logrotate.d/nginx 查看模拟执行过程(-d 是 debug 模式,不真实操作)
- 加 -v 参数可看到更详细输出,确认路径、权限、pid 读取是否正常
- 确认无误后,用 logrotate -f /etc/logrotate.d/nginx 强制执行一次,观察 /var/log/nginx/ 下是否生成 access.log.1、是否发送了 USR1 信号(Nginx 会新建日志文件)
- logrotate 默认由系统 cron 每天凌晨调用,无需额外设置定时任务
补充建议
几个容易忽略但影响效果的关键点:
- rotate 数值不是“天数”:比如日志量小,每天只生成一个归档,rotate 30 就约等于 30 天;若单日切多个(如按 size 触发),可能几天就存满 30 份,旧日志被删
- delaycompress 和 compress 要配对使用:单独开 compress 会导致最新归档立即压缩,不方便排查;开 delaycompress 后,.log.1 保持明文,.log.2 及更早才被压缩
- 容器环境注意 PID 路径和信号方式:Docker 中常用 docker kill -s USR1 容器名 替代 kill 命令,pid 文件可能不存在
- 如果想进一步减量,可在 Nginx 配置里精简 log_format,或用 if ($request_uri ~* \.(js|css|png|jpg)$) { access_log off; } 跳过静态资源日志


















