通过 nginx 的 upstream 模块定义多个后端服务器组,利用 weight 参数控制流量权重,并结合 geo 或 map 指令根据客户端 ip、cookie 或 header 将请求分流到不同的环境组,即可实现多环境灰度发布。具体做法是配置一个包含生产环境和测试环境的 upstream 列表,在 server 块中使用 if 或 map 判断请求特征,动态选择对应的 proxy_pass 目标地址。

如何配置基于权重的负载均衡
在 upstream 块中为不同环境的服务器设置不同的 weight 值,Nginx 会根据权重比例自动分配请求。例如,将生产环境设为高权重,灰度环境设为低权重,从而实现按比例灰度。这种配置适用于无状态且需要平滑过渡的场景,无需修改客户端请求即可实现流量切分。

upstream backend {
# 生产环境服务器
server 192.168.1.10:8080 weight=9;
# 灰度环境服务器
server 192.168.1.20:8080 weight=1;
}
上述配置中,每 10 个请求中约有 9 个转发至 192.168.1.10,1 个转发至 192.168.1.20。这种方式简单直接,但无法针对特定用户进行精准灰度,适合初步的流量观察阶段。
如何基于客户端标识进行精准灰度
使用 geo 或 map 指令匹配客户端 IP 或 Cookie,将特定用户的请求强制转发至灰度环境。这种方法允许运维人员指定内部测试账号或白名单用户访问新版本,确保功能验证的安全性。配置时需定义变量映射关系,并在 location 块中根据变量值切换 proxy_pass。

geo $gray_group {
default "prod";
192.168.1.100 "gray"; # 测试机 IP
}
server {
location / {
if ($gray_group = "gray") {
proxy_pass http://gray_backend;
}
proxy_pass http://prod_backend;
}
}
当请求来自 192.168.1.100 时,$gray_group 变量值为 gray,触发 if 条件,请求被转发至 gray_backend。其他所有请求默认走 prod_backend。注意:Nginx 中 inifull 语句不能与 proxy_pass 直接混用导致冲突,实际生产中更推荐使用 map 结合 upstream 别名或 separate server block 来实现更稳定的路由逻辑,或者使用 Lua 脚本增强灵活性。
灰度环境中 Cookie 回显的具体实现
在灰度发布中,常需确保同一用户在多次请求中始终访问同一环境,这通过设置特定的 Cookie 并让后端回传该 Cookie 来实现。Nginx 可通过 proxy_cookie_path 和 add_header 配合后端逻辑完成,或在 Nginx 层面直接注入 Cookie。若后端已处理 Cookie 逻辑,Nginx 只需确保透传;若需 Nginx 介入,可添加自定义 Header 供后端识别。
# 假设后端返回 Set-Cookie: gray=true
# Nginx 可直接透传,无需额外配置
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Gray-Flag $gray_flag;
}
此配置中,X-Gray-Flag 由上游 map 或 geo 决定,后端应用读取该 Header 决定是否写入灰度 Cookie。若需 Nginx 直接管理会话粘性,可使用 ip_hash 或 sticky 模块(如 openresty 的 sticky 插件),但标准 Nginx 不内置 sticky 功能,需依赖第三方模块或应用层实现。对于纯 Nginx 方案,推荐结合 map 与 cookie 解析(需 Lua 或编译模块)以实现更细粒度的控制。


















