实现10%用户灰度绕过缓存需同时设置proxy_cache_bypass和proxy_no_cache,推荐用split_clients基于cookie_user_id哈希分流,确保同一用户路径稳定;也可通过X-Gray-Skip-Cache请求头手动触发。

要让10%的用户绕过缓存做灰度测试,核心不是“随机丢掉10%的缓存响应”,而是让这10%的请求**既不读缓存,也不写缓存**——即跳过缓存查找(proxy_cache_bypass)且禁止响应落盘(proxy_no_cache)。Nginx 本身不提供“按用户ID哈希取模10%”的原生缓存绕过指令,但可以通过 map + split_clients 或变量组合精准实现。
用 split_clients 实现稳定、可复现的10%用户绕过
关键点是:同一用户每次请求都走相同路径(要么总绕过,要么总走缓存),避免体验割裂。推荐配置如下:
复制AI写代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 基于 Cookie 中的 user_id 做哈希分流
split_clients "${cookie_user_id}" $cache_skip {
10% "1";
* "0";
}
# 控制缓存行为
proxy_cache_bypass $cache_skip;
proxy_no_cache $cache_skip;
# 缓存区仍需正常定义(否则 bypass 无效)
proxy_cache my_cache;
proxy_cache_valid 200 10m;
说明:
• ${cookie_user_id} 是用户登录后写入的稳定标识,确保哈希结果一致;
• split_clients 对该值哈希后,严格按10%概率分配 $cache_skip = "1";
• 只要变量非空/非零,proxy_cache_bypass 就强制回源,proxy_no_cache 确保响应不进缓存。
用 map + 用户特征实现更灵活的10%控制
如果无法依赖 cookie,也可基于 IP、User-Agent 或请求头生成确定性标识:
复制AI写代码
1 2 3 4 5 6 7 8 9 10
map $remote_addr $cache_skip {
default 0;
"~^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" 1;
}
# 实际中不建议直接用IP哈希(NAT下失效),更适合配合 geo 模块或自定义 header
proxy_cache_bypass $cache_skip;
proxy_no_cache $cache_skip;
更实用的做法是前端在特定灰度用户请求中带上 X-Gray-Skip-Cache: 1,后端 Nginx 识别:
• proxy_cache_bypass $http_x_gray_skip_cache;
• proxy_no_cache $http_x_gray_skip_cache;
这样测试人员或内部账号可主动触发,无需改 cookie 或等哈希分布。
验证与注意事项
绕过是否生效,不能只看响应头有没有 X-Cache: MISS,重点确认三点:
- 上游服务日志中,被标记为灰度的请求是否真实到达(而非命中缓存后返回)
- 响应头中是否有
X-Proxy-Cache-Bypass: 1(可自定义添加用于调试) - 缓存目录里对应 key 是否完全没生成(用
proxy_cache_path配合cache manager观察)
注意:proxy_cache_bypass 和 proxy_no_cache 必须同时设置才完整。只设前者,新响应可能被缓存;只设后者,仍会返回旧缓存内容——两者缺一不可。


















