Nginx 日志轮转后,为什么还在写旧文件?

查看现有 logrotate 规则,再用 USR1 让 Nginx 重新打开日志。确认新请求写入新文件,旧文件不再增长。

Nginx 日志占满磁盘,直接删当前文件未必能腾出空间:进程可能还持有文件句柄。要安排日志轮转,并让 Nginx 重新打开日志文件。

改名与重新打开配合使用

Nginx 支持向主进程发送 USR1,让它重新打开日志;HUP 用于重载配置,与日志轮转的用途不同。常见轮转流程是先改名旧日志、创建新文件,再发送 USR1。

先读发行版已经提供的 /etc/logrotate.d/nginx,核对实际日志路径、用户、组和 PID 文件。不要新建另一个匹配同一批日志的规则。日志文件权限要允许 Nginx 写入,PID 文件应由服务在可信位置维护。

daily 并不会建立定时任务

daily 指定按日判断条件,仍需要 cron 或 systemd timer 调用 logrotate。rotate 14 保存的是轮转次数,空日志、漏跑或一天多次轮转都会影响历史覆盖时间,不能直接当成十四天保证。

delaycompress 推迟压缩最近一份旧日志,不能替代成功的重新打开操作。能正常使用 USR1 的 Nginx,不把存在丢日志窗口的 copytruncate 作为通用替代。

先检查规则和定时任务

下面检查主配置,不实际轮转:

sudo logrotate -d /etc/logrotate.conf
systemctl list-timers --all logrotate.timer
systemctl status logrotate.timer

没有该 timer 时,继续检查本机 cron 或面板调度,不能据此断定没有计划任务。容器内安装了 logrotate,也不代表容器会自动启动 cron。

需要强制验证时,确认规则与全局选项、安排维护时间,并保留回退配置;-f 不适合作为频繁巡检命令。

最后确认文件真的换了

发起一次正常访问,检查新文件是否记录请求、旧文件是否停止增长,以及文件所有者与权限。归档出现只证明旧文件被处理,新请求进入新日志才说明重新打开生效。

日志可能包含访问者地址和 URL 参数,归档也要限制读取。长期审计记录另行保存;本机日志轮转解决的是积累与保留,不能增加 VPS 套餐磁盘,也不能替代异地备份。

日志稳定后,磁盘仍不够怎么办

先验证新日志开始写入、旧文件按规则保留,再观察磁盘占用是否稳定。业务文件持续增长而磁盘确实不足时,参考存储 VPS 的选择,比较扩盘和迁移的费用。购买更大磁盘以后仍需保留轮转规则,否则相同问题会继续积累。

确实需要增加存储时,先按日志保留天数、业务数据和备份临时空间计算增长量。现有环境需要独立数据盘,可查看 ECS 的数据盘与实例组合;准备迁移整套网站,则比较 雨云 RCS 的磁盘与系统选项。轮转规则错误或已删除文件仍被进程占用,先修配置,再决定是否购买更大的盘。