排查磁盘占满应先检查error_log是否失控增长;通过nginx -T查路径、du看大小、lsof验句柄定位问题,用>清空或kill -USR1重建日志止血,再调级别、查错误、加buffer/flush优化,并配置logrotate与磁盘告警实现长期防护。

直接看 error_log 是否失控增长,是排查磁盘占满最常被忽略的第一步。它不像 access_log 那样显眼,但一旦开启 debug 级别或出现循环报错,几小时内就能写满几十 GB。
确认 error_log 是否真在撑爆磁盘
别只盯 df -h 的 100%,要定位到具体文件:
- 查 error_log 实际路径:nginx -T 2>/dev/null | grep "error_log",避免凭经验猜错位置
- 看大小和增长趋势:du -sh /var/log/nginx/error.log*,重点看 error.log 是否远超其他日志(比如 >5GB)
- 检查是否“删了还在写”:lsof +L1 | grep "error.log",若有输出,说明文件已被 rm 但 Nginx 还握着句柄,空间不会释放
快速止血:不重启、不断服地释放空间
清空内容比删除更安全,尤其当服务不能停时:
- 清空当前日志:> /var/log/nginx/error.log(注意是 >,不是 rm)
- 若已误删且 lsof 显示 deleted:kill -USR1 $(cat /var/run/nginx.pid),让 Nginx 重新打开新 error.log
- 验证是否生效:ls -lh /var/log/nginx/error.log 应显示 0 字节,且新错误会继续写入
锁定源头:为什么 error_log 突然暴增
常见原因有三类,需逐项排查:
- 日志级别设太高:配置中写了 error_log /path warn; 是合理选择;若为 debug 或 info,尤其在高并发下极易刷爆磁盘
- 存在持续报错:比如 upstream 不通、SSL 配置错误、模块加载失败等,Nginx 会每秒重复记录,tail -n 100 /var/log/nginx/error.log | sort | uniq -c | sort -nr 可快速发现高频错误行
- 异步写入未启用:没配 buffer 和 flush,大量小日志直写磁盘,I/O 压力大还容易卡住;建议加:error_log /var/log/nginx/error.log warn buffer=64k flush=5s;
长期防护:不让 error_log 再失控
靠手动清理永远被动,必须自动化+限流:
- 用 logrotate 管理:/var/log/nginx/error.log { size=100M daily rotate 7 compress delaycompress sharedscripts postrotate kill -USR1 $(cat /var/run/nginx.pid) 2>/dev/null endscript }
- 精简记录内容:非调试环境禁用 debug/info;生产环境 error_log 级别保持 warn 或 error 即可
- 加磁盘告警:用 df -h | awk '$5 > 85 {print $0}' 搭配 cron 或 Prometheus,空间超 85% 就发通知











