Nginx split_clients 模块实现无侵入A/B测试,需正确配置分流键(如$cookie_uid)、语法(引号包裹、百分比总和≤100%)、upstream绑定及分组透传;支持URL强制覆盖与日志抽样验证。

确认模块已启用并定义分流变量
主流 Nginx 发行版(如 Ubuntu 官方包、CentOS Stream、Alpine nginx:alpine)默认已编译 `--with-http-split-clients-module`,无需额外安装。只需在 `http { }` 块中定义变量:
- 变量名必须合法:不能含短横线(如 `$ab-version` 错误),推荐用下划线(`$ab_group`)
- 输入字符串必须加引号:`"$remote_addr"` 正确,`$remote_addr` 会报错
- 百分比总和必须 ≤100%,最后一项用 `*` 表示兜底,例如:
5%"v2"; *"v1"; —— 表示 5% 进 v2,其余 95% 进 v1
选择稳定可靠的分流依据
分流键决定用户是否“始终进同一组”,直接影响实验有效性:
- 登录用户首选 `$cookie_uid`:业务系统下发的唯一 ID,跨设备、跨会话稳定
- 游客可用 `$binary_remote_addr`:比 `$remote_addr` 更精确(IPv4 固定 4 字节,避免 NAT 下哈希坍缩)
- 慎用 `$http_user_agent` 或 `$args`:UA 可能含随机字段,URL 参数易变,会导致同一用户反复漂移
- 兜底组合写法(推荐):
map $cookie_uid $split_key { "" $binary_remote_addr; default $cookie_uid; }
再把 `$split_key` 作为 `split_clients` 输入,兼顾登录与未登录场景
绑定 upstream 实现精准转发
分流变量只负责“打标”,转发必须显式指向独立 upstream,不能拼接路径或靠 if 隐式跳转:
- 定义两个(或多个)明确的 upstream 块:
upstream backend_v1 { server 10.0.1.10:8080; }
upstream backend_v2 { server 10.0.1.11:8080; } - 在 location 中直接 proxy_pass:
proxy_pass http://backend_$ab_group;(结尾不加 `/`) - 务必透传分组信息给后端:
proxy_set_header X-AB-Group $ab_group; —— 用于日志归因、行为分析、链路追踪
支持运行时干预与验证手段
生产环境必须具备手动覆盖和效果观测能力:
- URL 强制指定(如 `?ab_force=v2`):
map $arg_ab_force $ab_group { "v1" "v1"; "v2" "v2"; default $ab_group; } - 抽样验证分流比例:
在 `log_format` 中加入 `$ab_group`,用 `access_log` 抽样统计各组出现频次 - 前端 JS 可读取响应头 `X-AB-Group` 或 HTML 注释,用于埋点、条件渲染或灰度功能开关
- 上线前先切 1% 流量验证,检查后端日志、监控指标、页面资源是否按预期加载


















