levels=1:2通过两级目录结构(16个顶层+256个子目录)将百万级缓存条目均匀分散至约4096个叶子目录,使每目录仅存200–300文件,避免单目录i/o瓶颈;需配合keys_zone、inactive、use_temp_path及稳定cache_key等配置协同生效。

levels 参数本身不加快单次文件查找速度,但它能有效防止海量缓存引发的目录级 I/O 瓶颈——这才是高并发下响应延迟升高的真正原因。
levels=1:2 是最实用的分层方案
该配置将缓存键(经 MD5 哈希后)按固定规则拆解为两级子目录路径:
- 第一级:取哈希值最后 1 位十六进制字符(0–f),生成 16 个顶层目录
- 第二级:取倒数第 2–3 位(00–ff),每个顶层目录下再建 256 个子目录
- 总共最多 4096 个叶子目录,路径形如
/var/cache/nginx/mycache/7/ab/cdef1234
百万级缓存条目下,每个子目录平均仅存 200–300 个文件,目录项查找基本保持常数时间。相同请求始终落入同一子目录,利于 page cache 复用和 SSD 预读。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
单设 levels=1:2 不足以见效
必须同步调整以下几项,否则分层效果会被抵消:
-
keys_zone=my_cache:10m:1MB 内存约存 8000 个 key,10m 可支撑约 8 万个活跃缓存项;过小会导致 key 频繁淘汰、重复落盘 -
inactive=30m或更长:避免设为 60s 这类极短值,否则高频清理重建会加剧磁盘 I/O 波动 -
use_temp_path=off:让临时响应体直接写入缓存目录,省去跨目录 rename 和一次磁盘 write - 挂载选项加
noatime:SSD 上禁用访问时间更新,降低元数据写放大;XFS 可加nobarrier,ext4 推荐commit=60
cache_key 设计决定分层是否真正均衡
路径由 cache_key 的 MD5 值前几位生成。若 key 中含 $request_time、$cookie_sessionid、毫秒级时间戳等高熵字段,哈希结果会严重倾斜——部分子目录堆积数千文件,其余长期为空,I/O 热点照旧。
推荐构造稳定 key:
- ✅
$scheme$host$request_uri(默认已过滤 query 中的动态参数) - ✅ 配合
map指令剔除utm_*、_ga、t=等 tracking 类参数 - ❌ 避免引入任何随请求剧烈变化的变量
上线后快速验证是否生效
- 执行
find /var/cache/nginx/mycache -type d | wc -l,确认子目录总数接近 4096 - 运行
find /var/cache/nginx/mycache -mindepth 3 -maxdepth 3 -type f | cut -d'/' -f5,6 | sort | uniq -c | sort -n,观察各子目录文件数是否相对均匀(无明显“一超多空”) - 检查 Nginx 错误日志,确认无
rename() failed (18: Invalid cross-device link)类报错(说明use_temp_path=off已安全启用)










