在 nginx 中配置 ab 测试,核心是利用 split_clients 模块将流量按百分比切分。具体做法是定义一个基于用户 ip 或 cookie 的哈希变量,通过该模块将其映射到不同的目标地址(如 v1 和 v2),然后在 location 块中使用 proxy_pass 指向这个动态变量即可实现灰度发布。

如何设置具体的流量比例与版本分配
要精确控制流量比例,需在 split_clients 指令中按顺序定义百分比区间。Nginx 会从上到下匹配,一旦命中即停止。例如,前 50% 的用户被分配到旧版本,剩余 50% 分配到新版本。这种配置确保了流量的确定性,即同一个用户每次访问都会得到相同的结果,这对于 A/B 测试的数据一致性至关重要。

http {
# 定义基础变量,通常使用客户端 IP
set $variant_base $remote_addr;
# 定义分流逻辑:0-50% 为 v1, 50%-100% 为 v2
split_clients "$variant_base" $variant {
50% v1;
* v2;
}
server {
listen 80;
location / {
# 根据变量值代理到不同后端
proxy_pass http://backend_$variant;
}
}
}
上述代码中,$variant_base 使用了 $remote_addr 作为哈希种子。如果希望基于 Cookie 进行更精准的用户级分流,可将 $remote_addr 替换为 $cookie_user_id。当请求进入时,Nginx 计算哈希值并落入对应的区间,最终 $variant 变量的值将是 v1 或 v2,从而驱动 proxy_pass 跳转到正确的上游服务器组。
如何处理多版本并行与默认回退
在实际生产中,往往需要同时运行多个版本或确保没有匹配时的默认行为。通过在 split_clients 中添加更多区间,可以支持多版本分流。关键在于最后一个区间必须使用通配符 *,它代表剩余的所有流量,起到默认回退的作用。如果没有这一行,未命中的请求可能会返回 500 错误或被忽略。

http {
set $user_hash $http_x_forwarded_for;
# 三版本分流:10% A, 20% B, 70% C (默认)
split_clients "$user_hash" $target_version {
10% version_a;
20% version_b;
* version_c;
}
server {
listen 80;
location / {
proxy_pass http://app_$target_version;
}
}
}
在这个配置中,流量被分为三部分:10% 流向 version_a,20% 流向 version_b,而剩下的 70% 全部流向 version_c。这里的 * 是必须的,它捕获了所有未被前两个条件覆盖的请求。这种结构允许你在引入新功能时,先小范围灰度(A),再扩大范围(B),最后全量(C),或者在某个版本出现故障时快速将流量切回稳定版(C)。
基于特定 Header 值的分流结果是什么
当使用自定义 Header(如 X-Test-Group)作为分流依据时,如果该 Header 不存在或为空,Nginx 会使用空字符串进行哈希计算。这意味着空值也会产生一个确定的哈希结果,从而被分配到某个特定的版本区间。这种行为可能导致部分未明确指定版本的请求被意外分流,因此在生产环境中,通常建议结合默认值处理或使用更稳定的标识符如 IP 或 Cookie。
,











