排查nginx proxy_cache引发的inode耗尽故障,核心是确认缓存目录是否因海量小文件占满inode:先用df -i /path/to/cache检查iuse%≥95%,再用du --inodes -s逐级定位高文件数子目录,结合lsof +l1查残留临时文件,最后通过清理过期缓存、设置max_size、优化levels和inactive参数治理。

排查 Nginx proxy_cache 引发的 inode 耗尽故障,核心是确认缓存目录是否因海量小文件占满 inode,而非磁盘空间本身不足。这类问题常表现为日志写入失败、新建缓存项失败、甚至 Nginx worker 进程报 No space left on device,但 df -h 显示磁盘仍有大量可用空间。
确认是否为 inode 耗尽而非磁盘块耗尽
直接检查缓存所在分区的 inode 使用率:
-
df -i /path/to/proxy_cache_root—— 重点看 IUse% 是否 ≥95% 或达 100% - 若 IUse% 高而
df -h中 Use% 较低(如 40%),基本可锁定是 inode 瓶颈 - 注意:
proxy_cache_path的根路径(如/data/nginx/cache)才是挂载点,不是其子目录
定位缓存目录下的高 inode 占用层级
Nginx 缓存默认使用 levels=1:2(即两级子目录结构),但若配置不当或缓存 key 过短,仍可能在某一层级堆积大量文件:
- 统计一级子目录文件数:
du --inodes -s /data/nginx/cache/* 2>/dev/null | sort -nr | head -10 - 若发现类似
a/、b/等单字母目录 inode 数异常高,进入该目录继续下钻:du --inodes -s /data/nginx/cache/a/* 2>/dev/null | sort -nr | head -5 - 最终定位到具体二级或三级子目录(如
/data/nginx/cache/a/ab/)中文件数量是否超数十万
检查是否由未清理的临时缓存文件导致
proxy_temp 目录与 proxy_cache 共享同一文件系统时,临时文件(如未完成的 proxy_buffer 写入)也可能持续占用 inode:
- 查已删除但仍被 worker 持有的文件:
lsof +L1 | grep -E "(proxy_temp|cache)" - 查 proxy_temp 下文件总数:
find /data/nginx/proxy_temp -type f | wc -l - 若存在大量
NGX开头的临时文件且长时间不消失,说明后端响应异常或超时未结束,导致临时文件未被自动清理
针对性清理与配置优化
确认问题根源后,清理需谨慎,优先通过配置控制长期增长:
- 立即释放:删除明确过期的缓存子目录(如
rm -rf /data/nginx/cache/a/ab/*),避免rm *报参数过长,改用find ... -delete - 限制缓存总量:
max_size=10g(必须设置,否则无硬上限) - 避免单目录膨胀:
levels=1:2:2(三级结构)比1:2更分散,适合高并发小资源场景 - 缩短冷数据淘汰时间:
inactive=2h加速低频缓存项释放 inode - 关闭临时文件中转:
use_temp_path=off,让缓存直写目标目录,减少中间文件生成











