一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中错误日志如何排查因磁盘空间不足导致的服务无响应

时间:2026-08-24 19:54:48 编辑:袖梨 来源:一聚教程网

磁盘空间不足不会让 Nginx 立即崩溃,但会导致 master 进程存活而 worker 无法写日志、建临时文件或缓存,表现为服务无响应、502/504、上传失败或超时;需用 df -h、lsof +L1、ps aux 等主动验证磁盘与进程状态,并通过清空日志、USR1 重载、logrotate 和分离缓存目录防复发。

磁盘空间不足不会让 Nginx 立即崩溃,但会让它“卡住”——master 进程还在,worker 却无法写日志、无法建临时文件、无法缓存,最终表现为服务无响应、502/504、上传失败或请求超时。排查关键不是等报错,而是主动验证磁盘与进程状态。

快速确认磁盘是否已满

别只看 error.log 有没有报错,先查底层空间:

  1. 运行 df -h,重点检查 /var/log/var/cache/nginx/tmp 所在分区是否 ≥95%;
  2. ls -lSh /var/log/nginx/ 查 access.log 和 error.log 大小,单个超 1GB 就高度可疑;
  3. 执行 df -i 看 inode 是否耗尽(尤其小文件多的场景),满也会导致“磁盘满”行为;
  4. 若发现某分区显示 100% 但实际文件加起来远没那么多,可能是坏块或只读挂载,需进一步验证。

检查 Nginx 是否因磁盘问题卡住

日志写不进、临时文件建不了,worker 进程会静默失效:

  1. 运行 ps aux | grep nginx:如果只有 master 进程,没有 worker,或 worker 状态为 Z(僵尸) 或 CPU 长期为 0,基本锁定;
  2. 执行 lsof +L1 | grep nginx:若有输出且含 deleted 字样(如 /var/log/nginx/error.log (deleted)),说明日志被删过但进程还占着句柄,磁盘虽空却无法释放;
  3. tail -f /var/log/nginx/error.log:如果日志完全不动,新请求也不触发写入,大概率是写入路径不可用。

从错误日志里找间接线索

error.log 本身可能不直接写“磁盘满了”,但会出现典型降级痕迹:

  1. 高频出现 open() "/var/log/nginx/access.log" failed (28: No space left on device) —— 明确指向磁盘满;
  2. 大量 mkdir() "/var/cache/nginx/proxy/..." failed (28: No space left on device) —— 缓存目录写入失败;
  3. 反复报 connect() failed (111: Connection refused) while connecting to upstream,但后端实际正常 → 很可能是 worker 因磁盘问题退出,只剩 master 在监听却无人处理;
  4. 出现 recv() failed (104: Connection reset by peer)upstream timed out,且伴随 worker 异常退出,也需结合磁盘状态交叉判断。

应急恢复与防复发要点

定位后要快速恢复,并堵住漏洞:

  1. 清空间别直接 rm 日志,用 echo "" > /var/log/nginx/access.log 清空内容,保留文件句柄;
  2. 若已误删且 lsof 显示 deleted,先 kill -USR1 $(cat /var/run/nginx.pid) 让 Nginx 重新打开日志文件;
  3. 配置中关闭非必要日志:access_log off; 在非核心 location,error_log ... warn; 降低日志级别;
  4. 必须启用 logrotate:配 daily、rotate 7、compress、notifempty,避免人工遗漏;
  5. 给缓存和临时目录单独挂载小容量磁盘,或限制 max_sizeinactive,防止缓存无限膨胀。

热门栏目