Nginx access_log写入失败且df -h显示磁盘有余量时,大概率是Inode耗尽;需用df -i确认IUse%是否达100%,再通过find定位并清理大量小文件,最后修复logrotate配置防止复发。

当 Nginx 的 access_log 写入失败,且错误日志中出现类似 open() "/var/log/nginx/access.log" failed (28: No space left on device) 的提示,但 df -h 显示磁盘空间仍有余量时,大概率是该分区的 Inode 耗尽。Nginx 无法新建日志文件(例如 logrotate 切割后的新文件、或因权限问题反复创建失败的临时文件),就会导致写入失败。
确认目标分区 Inode 使用情况
先定位 access_log 配置的实际路径(检查 nginx.conf 或 site 配置中的 access_log 指令),再用 df -i 查看对应挂载点的 Inode 使用率:
- 例如日志路径为
/var/log/nginx/access.log,执行df -i /var/log或df -i /var(取决于挂载结构) - 重点关注
IUse%列,若接近或达到 100%,即为根因 - 注意:Inode 耗尽与磁盘空间无关,
df -h看不到问题
快速定位大量小文件的来源
Inode 耗尽通常由海量小文件(尤其是空文件、临时文件、未清理的旧日志)引起。常用排查命令:
- 统计指定目录下各级子目录的文件数量:
find /var/log/nginx -xdev -type f | cut -d/ -f1-4 | sort | uniq -c | sort -nr | head -20 - 查看最近 7 天内创建的文件:
find /var/log/nginx -xdev -type f -ctime -7 | wc -l - 检查是否有异常命名的日志文件(如
access.log.1234567890连续编号、或带 PID 的临时文件) - 留意 logrotate 是否配置了
create但权限/属主错误,导致每次 rotate 都失败并残留空文件
临时恢复 + 长期规避措施
立即释放 Inode:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 删除确认无用的小文件(如过期的
.old、.tmp、重复的 rotate 备份):find /var/log/nginx -name "*.old" -delete - 清空已归档但不再需要的压缩日志:
find /var/log/nginx -name "*.gz" -mtime +30 -delete - 重启 Nginx(确保新日志能正常打开):
nginx -t && systemctl reload nginx
防止复发:
- 检查 logrotate 配置(如
/etc/logrotate.d/nginx),确保包含rotate 30、compress、missingok和正确的create 0644 nginx nginx - 避免在日志路径下手动 touch 大量测试文件;禁止脚本无限制生成 timestamp 命名的临时日志
- 对高流量站点,考虑将 access_log 重定向到 syslog 或异步收集系统(如 filebeat + Kafka),减少本地文件压力
补充验证方法
确认问题是否真正解决:
- 执行
df -i确认 IUse% 显著下降(比如从 100% → 85%) - 手动触发一次 logrotate:
logrotate -f /etc/logrotate.d/nginx,观察是否成功生成新文件且无报错 - 访问业务接口,检查
tail -f /var/log/nginx/access.log是否有新增记录 - 查看 Nginx error_log 中是否还有
No space left on device类报错










