nginx通过proxy_cache_path的levels指令自动生成多级缓存目录,如levels=1:2:2按md5哈希末位分三级子目录,均匀分散文件以降低inode查找开销;需配合keys_zone、proxy_cache等指令启用,并通过x-proxy-cache响应头验证命中效果。

用 proxy_cache 配置多级目录结构,核心目标是降低 inode 查找开销、避免单目录文件过多导致的性能衰减。Nginx 本身不直接支持“手动定义多级路径”,而是通过 levels 指令自动按缓存键哈希值切分生成两级或三级子目录,这是提升大规模缓存读写效率的关键机制。
理解 levels 参数与目录层级生成逻辑
Nginx 缓存路径由 proxy_cache_path 的 levels 值决定,格式为 levels=1:2 或 levels=2:2:2 等。每段数字代表一级子目录的长度(字符数),从缓存键(如 $scheme$proxy_host$request_uri)的 MD5 哈希值末尾向前截取。
例如:levels=1:2 表示:
- 第一级:取哈希值最后 1 位(如
f),创建/cache/f/ - 第二级:再取前 2 位(如
3a),在f下建/cache/f/3a/ - 最终缓存文件存为
/cache/f/3a/3a7f...(完整哈希)
这样能把数十万甚至百万级缓存文件均匀分散到最多 16 × 256 = 4096 个子目录中,显著减少单目录文件数量,加快文件系统查找速度。
配置 proxy_cache_path 启用多级结构
在 http 块中添加缓存路径声明,必须指定 levels 和 keys_zone:
proxy_cache_path /var/cache/nginx/proxy levels=1:2:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
说明:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
levels=1:2:2:生成三级目录(如/a/bc/def/...),适合高并发、大缓存场景 -
keys_zone=my_cache:10m:分配 10MB 内存存缓存键元数据(可支撑约 8 万活跃 key) -
max_size=1g:磁盘总容量上限,超限时自动清理最久未用项 -
use_temp_path=off:让临时文件直接写入缓存目录,避免跨文件系统拷贝
在 server 或 location 中启用并控制缓存行为
仅声明路径还不够,需在具体上下文中调用:
server {<br> location /api/ {<br> proxy_pass https://backend;<br> proxy_cache my_cache;<br> proxy_cache_valid 200 302 10m;<br> proxy_cache_valid 404 1m;<br> proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;<br> proxy_cache_lock on;<br> proxy_cache_lock_timeout 3s;<br> }<br>}
关键点:
-
proxy_cache必须与keys_zone名称一致 -
proxy_cache_valid按响应状态码分别设置过期时间,避免缓存错误响应 -
proxy_cache_lock防止缓存失效时多个请求同时回源(“缓存击穿”)
验证与调优建议
配置完成后,检查缓存目录是否按预期生成多级结构:
ls -l /var/cache/nginx/proxy/ —— 应看到类似 a/ b/ c/ ... 的 16 个一级目录ls -l /var/cache/nginx/proxy/a/ —— 每个下应有 00/ 01/ ... ff/ 共 256 个二级目录
运行中可通过以下方式确认命中效果:
- 查看响应头:
X-Proxy-Cache: HIT或MISS - 统计日志:
log_format cache '$remote_addr - $upstream_cache_status ...'; - 监控磁盘 IO:多级结构显著降低
stat()和open()系统调用延迟










