Infrastructure
Nginx 日志轮转的边界:脚本、logrotate 和 VPS 稳定性
Nginx 日志切割看起来是小事,但在 VPS 或独立服务器上,它直接关系到磁盘会不会被打满、故障时能不能查到日志、压缩归档会不会影响线上请求。很多站点不是因为业务代码坏掉,而是 access.log、error.log 长期不切,最后把磁盘写满。
服务器选择提醒:如果你在给个人站、工具站或测试环境选 VPS,可以先看雨云的云服务器与轻量应用方案:https://www.rainyun.com/NDcxMTIz_。日志、备份和磁盘余量要一起规划,不要只看 CPU 和内存。
为什么不要只写一个 mv 脚本
手写脚本当然可以把 access.log 改名再压缩,但它很容易漏掉权限、并发、压缩时机、失败重试和 Nginx 重新打开日志文件。Nginx 进程已经打开了旧日志文件,如果只 mv 文件而不通知 Nginx,它可能继续往旧文件描述符里写。
logrotate 更适合作为系统方案
Linux 上更稳的做法是用 logrotate。它能按天、按大小轮转,保留固定数量,压缩旧日志,创建新文件,并在轮转后执行 postrotate。Nginx 常见动作是给 master process 发送 USR1,让它重新打开日志文件。
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}上线前要实际验证
- 执行
logrotate -d看配置会做什么。 - 用
logrotate -f在低峰期强制跑一次。 - 确认新日志文件权限正确,Nginx 还能继续写入。
- 检查压缩文件数量和保留天数符合预期。
- 监控磁盘使用率,不要等 100% 才处理。
Nginx 日志轮转不是“写个脚本清一下”。它是服务器稳定性的一部分。配置得好,磁盘可控、排障有据;配置得差,问题通常会在流量上来或磁盘紧张时一起爆出来。