需配置keys_zone=1300m以稳定支撑千万级URL缓存,按1MB存8000个key计算得出;目录层级设levels=1:2防IO瓶颈;须规避不可热扩容、跨文件系统、内存磁盘职责混淆三大硬约束。

要让 proxy_cache_path 的 keys_zone 内存区域稳定支撑千万级代理资源(比如日均 1000 万唯一 URL),关键不是堆内存,而是按 key 实际数量精准计算 + 预留缓冲 + 规避硬限制。
先算清你需要多少 MB 的 keys_zone
keys_zone 存的是每个缓存项的 key 字符串、过期时间、访问计数等元数据,不存响应体。实测经验:
✅ 1MB 共享内存 ≈ 存 8000 个唯一 key
所以:
- 日均 1000 万个唯一请求 → 至少需要
10,000,000 ÷ 8000 ≈ 1250 MB - 向上取整,建议设为
keys_zone=my_cache:1300m(即 1.3GB)
⚠️ 注意:这个数字基于你实际使用的 proxy_cache_key 粒度。
如果用了 $scheme$host$uri$is_args$args(带完整参数),key 数量可能比仅用 $uri 多几倍;务必用日志验证:
# 统计带完整 query 的唯一请求(Nginx 默认 access.log 格式)
awk -F'"' '{print $2}' access.log | awk '{print $1,$2}' | sort -u | wc -l目录层级必须匹配高 key 量场景
千万级 key 意味着缓存文件可能超百万甚至千万个。单目录放太多文件会严重拖慢 inode 查找。
✅ 推荐固定用 levels=1:2:
- 第一级:MD5 最后 1 位 → 16 个目录(0–9,a–f)
- 第二级:往前取 2 位 → 每个一级目录下最多 256 个子目录
- 最终单个叶子目录平均承载几千文件,IO 压力可控
❌ 避免 levels=1 或 levels=2:2:2:前者退化成单层海量文件,后者生成冗余目录但没实质收益。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
绕不开的三个硬约束,千万不能踩
-
不可热扩容:
keys_zone=my_cache:1300m一旦写死,重启 Nginx 才生效;运行中无法增大。上线前必须一次估足,别留“后续再加”的侥幸。 -
不跨文件系统:
proxy_cache_path路径和它的上级挂载点必须在同一磁盘分区。否则会出现Invalid cross-device link错误,缓存直接失效。 -
内存与磁盘职责分离:
keys_zone只管 key 索引,max_size才管磁盘用量。即使keys_zone装不下所有 key,Nginx 会淘汰旧 key(LRU),但只要磁盘没满、文件还在,命中仍可能成功——只是索引丢了,得重新生成 key 并回源。
一个稳妥的千万级配置示例
proxy_cache_path /data/nginx_cache levels=1:2 keys_zone=my_cache:1300m inactive=45m max_size=50g use_temp_path=off;
说明:
-
/data/nginx_cache需是独立大容量 SSD 分区,确保有足够 inodes 和 IOPS -
inactive=45m比默认 60m 更激进,加快冷 key 清理,缓解 keys_zone 压力 -
use_temp_path=off强制跳过临时目录拷贝,减少跨设备风险和延迟
不复杂但容易忽略

















