必须设levels是为了避免单目录文件过多导致文件系统性能下降;推荐levels=1:2(16×256个子目录),高并发场景可用levels=2:2:2(1677万槽位),单层结构如levels=1无效,且需与keys_zone名称配套使用。

levels 参数决定缓存目录的层级结构,核心目标是避免单目录下文件过多导致性能下降。Nginx 默认不建深层级,但生产环境必须手动设置。
为什么必须设 levels
缓存键(key)经哈希后生成固定长度字符串,若所有缓存文件都放在同一目录,当缓存项超几万时,文件系统遍历效率急剧下降——尤其 ext4 或 XFS 在单目录超过 1~2 万个文件时,stat/open 等操作延迟明显升高。levels 就是用来“分而治之”的。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
常用且稳妥的 levels 组合
- levels=1:2:最推荐的通用配置。第一级用哈希值最后 1 位十六进制字符(16 个子目录),第二级用最后 2 位(共 16×256 = 4096 个子目录)。适合中小规模业务,单目录文件数可控在千级以内。
- levels=2:2:2:适用于高并发、大缓存容量场景(如 CDN 边缘节点或千万级日 PV 站点)。三级各取 2 位哈希,共 256×256×256 = 1677 万个目录槽位,几乎杜绝碰撞和拥挤。
- 避免使用 levels=1 或 levels=2 这类单层结构——它只建一级子目录,仍易堆积,起不到分流作用。
配合 keys_zone 使用才生效
levels 必须与 proxy_cache_path 的 name(即 keys_zone 名称)配套使用。例如:
proxy_cache_path /var/cache/nginx/mycache levels=1:2 keys_zone=mycache:100m inactive=60m;这里 mycache 是 zone 名,levels 定义了物理路径结构,Nginx 会自动按哈希值末几位创建类似 /var/cache/nginx/mycache/c/2a/ 这样的嵌套路径(c 来自最后 1 位,2a 来自后 2 位)。
别忽略目录权限与磁盘布局
- 确保 nginx 工作用户(如 www)对 cache 目录有读写执行权限;
- 缓存盘建议用 SSD,且不要与系统日志或应用数据混在同一挂载点;
- 定期用
find /var/cache/nginx/mycache -type f | wc -l观察单目录文件数,若某子目录持续超 5000,说明当前 levels 分布不够细,可升级为 2:2 或 1:2:2。










