proxy_cache_lock通过串行化同key缓存未命中请求防雪崩,需配合keys_zone定义、统一cache_key、proxy_cache_lock_timeout与proxy_cache_use_stale等配置协同生效。

缓存失效瞬间大量请求同时回源,是压垮后端的典型场景。核心不是“限制请求”,而是让 Nginx 主动协调请求、错开回源、兜住旧内容。
用 proxy_cache_lock 合并同类请求
当缓存缺失(MISS)时,只放行第一个请求去后端取数据,其余请求等待缓存写入完成后再响应:
- 启用锁:proxy_cache_lock on;
- 设置等待上限:proxy_cache_lock_timeout 3s;(超时后仍未写入则直接回源)
- 防止锁长期占用:proxy_cache_lock_age 5s;(若首个请求耗时超 5 秒,允许第二个请求也尝试回源)
用 proxy_cache_use_stale 提前兜底
缓存未过期但后端已不可用时,返回旧内容而非等待或报错:
- 覆盖常见故障:proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;
- 必须确保缓存本身有效:依赖 proxy_cache_valid 设置合理有效期(如 200 302 10m;)
- 需配合 proxy_cache_lock 和 proxy_cache_background_update on; 才能让
updating真正生效
用 background_update 实现静默刷新
用户拿到的是旧缓存,Nginx 在后台悄悄拉新数据,避免下一轮集体失效:
- 开启后台更新:proxy_cache_background_update on;
- 前提:必须有 proxy_cache_use_stale updating; 和 proxy_cache_lock on;
- 效果:缓存即将过期时,首个命中请求触发后台更新,其他请求继续返回旧内容
收紧 cache_key 防止无效分裂
同一个资源因参数、Cookie 或 Header 差异生成多个 key,会导致缓存命中率低、回源请求分散:
- 简化键值:proxy_cache_key "$scheme$host$request_uri";(去掉 $args、$cookie_、$http_authorization)
- 如需保留部分参数,先标准化 URI:例如过滤 ?t=、?v= 等随机参数再构 key
- 对登录态接口,显式加入身份标识(如 $cookie_user_id),避免用户数据串扰











