磁盘空间或inode耗尽会导致nginx日志停止写入;需用df -h和df -i分别检查块空间与inode使用率;紧急时可清空旧日志或truncate当前日志,再发usr1信号恢复写入,并配置logrotate及磁盘监控。

磁盘空间彻底爆满是导致 Nginx 日志停止写入的硬性阻断原因——日志文件无法创建或追加,系统直接返回 No space left on device(错误码 28),此时即使权限、配置、进程都正常,日志也会完全静默。
确认磁盘是否真的已满
不要只看 df -h 的 “Use%” 数值,要同步检查两个关键指标:
-
磁盘块(block)空间耗尽:运行
df -h,重点看/var/log或 Nginx 日志所在分区的Use%是否为 100%,以及Avail是否为 0 -
Inode 耗尽:运行
df -i,若IUse%达到 100%,即使磁盘还有空间,也无法新建日志文件(常见于大量小日志轮转后未清理)
紧急释放空间(不重启 Nginx)
目标是快速腾出至少几十 MB 可用空间,让 Nginx 恢复写入能力:
- 清空 非关键旧日志:比如
/var/log/nginx/*.log.*.gz(压缩归档)、/var/log/nginx/access.log-2025*等明显过期的轮转文件 - 慎删但可操作:
truncate -s 0 /var/log/nginx/access.log(清空当前日志内容,保留文件句柄,Nginx 不会中断写入) - 避免直接
rm /var/log/nginx/access.log:若未配置 logrotate 的create或未发USR1信号,删除后 Nginx 可能因文件丢失而停止写日志 - 检查其他大日志目录:
/var/log/journal/(systemd-journald)、/var/log/apt/、/var/log/syslog*,用du -sh /var/log/* | sort -hr | head -10快速定位
恢复日志写入并防止复发
释放空间只是临时解法,必须立刻触发日志重建与长期管控:
- 发送
USR1信号通知 Nginx 重新打开日志文件:kill -USR1 $(cat /var/run/nginx.pid)(确保它立即开始往新文件写,而非继续尝试写满的旧文件) - 验证是否恢复:
tail -f /var/log/nginx/access.log查看是否有实时请求日志输出 - 立即启用或修复
logrotate:确认/etc/logrotate.d/nginx存在且配置含daily、rotate 30、compress、postrotate kill -USR1 ...;再执行logrotate -f /etc/logrotate.d/nginx强制跑一次 - 设置磁盘水位监控:例如用
df -h | awk '$5 > 90 {print "ALERT: "$1" is "$5" full"}'加入定时检查,提前预警
进阶防护建议
面向长期稳定运行,推荐两项低侵入改进:
-
限制单个日志大小:在 Nginx 配置中改用按大小轮转(需 logrotate 支持),例如把
daily替换为size=100M,避免某天突发流量撑爆磁盘 -
分离日志存储路径:将
access_log /data/logs/nginx/access.log指向独立挂载的大容量磁盘分区,与系统盘解耦











