Nginx缓存小文件过多会耗尽inode,需用df -i确认IUse%是否超95%,再用find统计并清理老旧缓存文件,同时优化proxy_cache_path的levels和cache_key以减少冗余目录与key。

当 Nginx 缓存目录(如 /data/nginx/cache)中积累了海量小缓存文件,极易耗尽 inode——即使磁盘空间还有几十 GB,也会报 “No space left on device”。这类问题不看 inode 使用率,单靠 df -h 完全无法发现。
确认是不是 inode 耗尽
执行命令直接查看 inode 使用情况:
-
df -i—— 查看各挂载点的 IUse%,重点关注 Nginx 缓存所在分区(比如/data)是否接近或达到 100% - 若
/data分区 IUse% ≥95%,而df -h /data显示使用率仅 40%~60%,基本可锁定为缓存小文件导致的 inode 耗尽
定位缓存目录下的高 inode 占用路径
Nginx proxy_cache_path 默认采用 levels=1:2 多级子目录结构,单个目录下文件数有限,但整体目录树可能含数百万个文件。快速统计子目录文件数量:
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
-
find /data/nginx/cache -type f | wc -l—— 查总文件数(通常超 200 万即高风险) -
find /data/nginx/cache -maxdepth 3 -type d | while read d; do echo "$(find "$d" -maxdepth 1 -type f 2>/dev/null | wc -l) $d"; done | sort -nr | head -10—— 找出文件最密集的 10 个缓存子目录
清理或限制缓存以释放 inode
删除文件能释放 inode,但必须避免暴力清空引发 Nginx 异常:
- 优先用 Nginx 自带机制清理:
nginx -s reload不影响服务,且会触发 inactive 清理(前提是配置了inactive=7d等参数) - 手动清理前先停写缓存:临时注释掉
proxy_cache相关指令,再nginx -s reload,之后再批量删除:find /data/nginx/cache -type f -mtime +7 -delete - 长期预防:在
proxy_cache_path中显式设置max_size=20g(例如),并确保inactive时间合理(如inactive=1d),让 Nginx 主动淘汰冷数据
验证缓存配置是否加剧 inode 消耗
某些缓存配置会显著增加小文件生成量:
- 检查
levels值:levels=1:2生成最多约 4096 个一级目录 × 256 个二级目录 = 超百万路径,但每个路径下若只存 1~2 个文件,反而浪费 inode;可尝试改为levels=2:2提升分布密度,减少目录总数 - 确认 key 是否过于离散:如
proxy_cache_key $scheme$host$request_uri$is_args$args包含动态参数(如时间戳、随机数),会导致同一资源被反复缓存为不同 key,生成大量冗余小文件 - 避免对高频小响应(如 API 返回 1KB JSON)开启缓存,这类内容更适合用内存缓存或直接 bypass

















