灰度发布中让新版本流量绕过缓存,核心是使灰度请求既不读缓存也不写缓存,普通用户仍走缓存;需用可信Header或Cookie识别灰度身份,配合proxy_cache_bypass与proxy_no_cache同location同变量启用,并可选隔离cache key。

灰度发布中让新版本流量绕过缓存,核心不是“清掉旧缓存”,而是让匹配灰度条件的请求**不读缓存、也不写缓存**,同时确保普通用户仍正常走缓存。关键在于精准识别灰度身份,并用 Nginx 原生指令控制缓存行为,避免污染和误命中。
用请求头或 Cookie 精准识别灰度用户
灰度身份应来自可信上下文,而非公开参数。推荐方式:
- 前端在灰度用户会话中注入自定义 Header,如 X-Gray-Version: v2,Nginx 内部对应变量为 $http_x_gray_version
- 后端网关或登录态服务在响应 Set-Cookie 时写入 gray_mode=v2,Nginx 可通过 $cookie_gray_mode 获取
- 避免使用 $arg_gray=1 这类 URL 参数——易被构造、难收敛、可能被 CDN 或浏览器缓存固化
配对启用 proxy_cache_bypass 和 proxy_no_cache
仅跳过读取会导致灰度响应被缓存,后续普通用户可能拿到新版本内容。必须两者同变量、同 location 同时生效:
- proxy_cache_bypass $http_x_gray_version $cookie_gray_mode; → 请求带灰度标识时,不查缓存,直连后端
- proxy_no_cache $http_x_gray_version $cookie_gray_mode; → 同样条件下,该响应禁止写入缓存区
- 两个指令必须出现在同一
location块内,且该 location 已启用 proxy_cache
隔离灰度缓存 key(可选但推荐)
若灰度版本需独立缓存(如接口返回结构不同),可在 proxy_cache_key 中加入灰度标识:
- proxy_cache_key "$scheme$request_method$host$request_uri$http_x_gray_version$cookie_gray_mode";
- 这样灰度请求即使未 bypass,也会生成独立缓存 key,与普通用户完全隔离
- 注意:此方式需确保灰度标识稳定、不可伪造,否则可能引发 key 爆炸
验证是否真正绕过且不污染
上线前用真实灰度请求验证三件事:
- 发起带 X-Gray-Version: v2 的请求,检查响应头中 $upstream_cache_status 日志值是否为 BYPASS(不是 MISS)
- 紧接着发一个无灰度标识的相同 URI 请求,确认返回内容仍是旧版本(说明灰度响应未被缓存)
- 用 curl 查看响应头:不应出现 X-Cache: HIT;若自定义了缓存标识头(如 X-Cache-Status),此时应显示 MISS 或空值,而非 HIT


















