proxy_cache_lock_age 并不存在于任何稳定版 Nginx 中,使用会导致启动失败;实际有效的是 proxy_cache_lock on 与 proxy_cache_lock_timeout 配合控制缓存未命中时的并发回源行为。

proxy_cache_lock_age 并不是 Nginx 官方支持的指令,它**不存在于任何稳定版 Nginx(包括 1.24.x、1.26.x)的配置语法中**。当前所有权威文档、源码及发行版均无此参数。你在配置中使用它会导致 Nginx 启动失败(报错:unknown directive "proxy_cache_lock_age")。
真正起作用的是 proxy_cache_lock + proxy_cache_lock_timeout
应对高负载下的缓存并发响应,核心机制是:
- proxy_cache_lock on:启用“首个请求放行、其余等待”的锁行为,仅对未命中缓存(MISS)生效
- proxy_cache_lock_timeout 3s–8s:控制等待上限——超时后等待请求不再干等,而是各自回源(此时可能仍发生击穿)
为什么有人误传 “lock_age”?
该说法可能混淆了以下两个概念:
-
proxy_cache_valid:定义缓存项的有效期(如
proxy_cache_valid 200 302 10m),决定缓存是否过期 - proxy_cache_use_stale updating:当缓存即将过期、后台正在更新(updating)时,允许直接返回旧缓存,避免用户等待新响应
后者(updating)常被误称为“锁老化”,但它和 lock 本身无关,也不影响锁的等待逻辑。
高负载下提升并发响应的关键调优点
不靠虚构参数,而靠组合策略降低回源压力:
- 把
proxy_cache_lock_timeout设为 5s:平衡等待收益与超时风险;太短(如 1s)导致大量并发回源,太长(如 15s)放大首屏延迟 - 强制启用
proxy_cache_use_stale error timeout updating http_500 http_502:即使后端抖动或缓存正在刷新,也优先返回可用旧内容 - 精简
proxy_cache_key,确保同类请求生成相同 key:
例如用proxy_cache_key "$scheme$host$request_uri";忽略变动 query 参数(如?t=123),避免同一资源被拆成多个锁 - 配合
inactive=60m和足够大的keys_zone(如my_cache:20m),保证热 key 长期驻留内存,减少 key 查找开销
验证是否生效的简单方法
在 location 中加入:
add_header X-Cache-Status $upstream_cache_status; add_header X-Cache-Lock $upstream_cache_lock;
发起并发请求(如用 ab -n 100 -c 20 压测一个未缓存路径),观察响应头:
• 多个请求中仅少数返回 X-Cache-Status: MISS,其余为 HIT 或 UPDATING
• 出现 X-Cache-Lock: 1 表示该请求触发了锁等待











