split_clients 是 nginx 内置模块,基于请求变量做一致性哈希实现稳定 a/b 分流;配置通过 split_clients 指令定义分组变量,结合 map 或 if 应用于 upstream、静态资源或请求头透传,并需注意哈希精度、代理环境适配及灰度覆盖等优化事项。

什么是 split_clients 模块
split_clients 是 Nginx 官方提供的内置模块,用于根据请求的某个变量(如 $remote_addr、$cookie_uid 等)做一致性哈希,将用户稳定地划分到不同分组中。它不依赖外部服务,不记录状态,适合轻量、无状态的 A/B 测试场景。
如何配置基础 A/B 分流规则
核心是用 split_clients 指令定义变量,并结合 if 或 map 控制 upstream 或静态资源路径。例如:
在 http 块中定义分组变量:
split_clients "$remote_addr" $ab_version {
50% "v1";
50% "v2";
}
该配置按客户端 IP 哈希,确保同一 IP 总是命中同一版本。注意:$remote_addr 在有代理时可能不准确,建议改用 $http_x_forwarded_for 或更可靠的 $cookie_ab_id(需前端配合写入)。
将分组结果应用到页面或接口
分流后需把 $ab_version 传递给后端或用于选择静态资源。常见方式有两种:
- 反向代理到不同 upstream:用 if 判断 $ab_version,proxy_pass 到对应后端集群;
- 响应不同 HTML 文件:用 try_files 或 alias 匹配 /index_v1.html 和 /index_v2.html;
- 透传版本信息给后端:通过 proxy_set_header X-AB-Version $ab_version,便于后端日志采集和行为分析。
不建议在 location 中直接用 if + return,易引发配置冲突;优先使用 map 指令做映射,更清晰安全。
注意事项与优化建议
split_clients 的哈希是确定性的,但默认只对字符串首字节哈希,精度有限。可通过在变量后拼接固定 salt 提升分布均匀性,例如:split_clients "${remote_addr}salt123" $ab_version { ... }
真实环境中还需考虑:
- 灰度用户需支持手动覆盖(如带 ?ab=v2 参数强制进 v2),可用 map + $args 实现优先级覆盖;
- 首次访问无 cookie 时,IP 可能因 NAT 变化导致分组漂移,建议引导前端生成并持久化唯一 ID;
- 上线前用小流量(如 1%)验证配置是否生效,检查响应头或 HTML 注释中是否含版本标识。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











