Nginx proxy_cache 通过打散key、启用proxy_cache_lock+stale机制、差异化缓存时效、容错返回stale内容四类手段缓解缓存雪崩。核心在于合理设计key、设置过期策略、控制并发回源与失败兜底。

Nginx 的 proxy_cache 本身不能直接“防御缓存雪崩”,但它能通过降低回源密度、错峰过期、串行化击穿请求这三类手段,显著缓解雪崩的冲击面。关键不在“开不开缓存”,而在于怎么设计 key、怎么设有效期、怎么锁住并发、怎么兜底失败。
一、用 proxy_cache_key 打散 key,避免整点/整分集体失效
雪崩常因大量语义相同的请求生成不同 key,又统一设了固定 TTL(比如全部 5m),结果整点一到全过期。打散的核心是让 key 分布更均匀:
-
路径归并(最常用):忽略 query 参数,强制同一接口共用缓存
proxy_cache_key "$scheme$host$uri";
/api/user?id=1001和/api/user?id=1002都变成/api/user,只有一份缓存、一个过期时间。 -
ID 取模分片(适合资源量大、ID 连续场景):
set $shard_id "0"; if ($args ~ "id=(\d+)") { set $shard_id "$1"; } map $shard_id $shard_bucket { default 0; ~^[0-9]+$ "$shard_id % 8"; } proxy_cache_key "$scheme$host$uri $shard_bucket";把 ID 对 8 取模,自然分成 8 组,每组过期时间错开,整体过期压力下降约 8 倍。
-
嵌入小时扰动(适合低频更新页):
proxy_cache_key "$scheme$host$uri $time_iso8601_hour";
每小时生成新 key,旧 key 自然淘汰,彻底避开“秒级集中失效”。
WebChat Voice Proxy下载⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
二、配齐 proxy_cache_lock + stale 机制,把并发回源压成串行
这是应对“单个热点 key 瞬时未命中”的核心防线,虽不解决大规模雪崩,但能拦住雪崩中最易压垮后端的那波尖峰:
- 必须启用缓存区和缓存指令:
proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:128m inactive=1h use_temp_path=off;
- 在 location 中开启缓存与锁:
proxy_cache api_cache; proxy_cache_lock on; proxy_cache_lock_timeout 5s; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
- 同时确保 key 统一(否则锁无效):
proxy_cache_key "$scheme$host$uri"; proxy_ignore_headers Set-Cookie Vary;
⚠️ 注意:
proxy_cache_lock只对同一个 key 生效。如果 key 设计不合理(比如含$args或随机参数),它就等于没开。
三、设置差异化缓存时效,源头减少 MISS 次数
不要所有响应都 5m,按状态码和业务敏感度分级控制:
proxy_cache_valid 200 302 5m; # 正常数据,短时效+打散够用 proxy_cache_valid 404 1m; # 错误页缓存短些,防恶意刷 proxy_cache_valid 301 307 1h; # 重定向可稍长 proxy_cache_valid any 10s; # 兜底,防配置遗漏导致完全不缓存
对高耗时但更新慢的接口(如字典、公告),可放宽到 1h 或 4h,大幅降低回源频次。
四、加一层容错:MISS 时返回 stale 缓存,不等不穿透
当首个请求正在回源、或失败时,后续请求不应干等或直接穿透:
proxy_cache_use_stale updating; # 正在更新时,返回旧缓存 proxy_cache_use_stale error timeout http_500; # 出错/超时也返回旧内容 proxy_cache_background_update on; # 后台异步刷新,不影响用户
这对运营页、配置接口特别有效——用户看到的是“最多 5 分钟前”的内容,但服务始终在线。
不复杂但容易忽略。

















