
— 特色专栏 —
大家好,我是民工哥!
大家都知道,无论是运维、开发、测试,Nginx 技术栈的学习总是必不可少的,只是不同的岗位掌握的深度与广度不同而已。

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,支持热部署,几乎可以做到 7 * 24 小时不间断运行,还可在不间断服务的情况下对软件版本进行热更新。Nginx 性能非常牛逼,占用内存少、并发能力强、能支持高并发,支持绝大部分协议,如TCP、UDP、SMTP、HTTPS等。最重要的是, Nginx 是免费开源的且可以商业化,配置使用也比较简单。

在中国有众多互联网大厂,如百度、京东、新浪、网易、腾讯等都在使用 Nginx,也有很多高知名度的国外网站也在使用 Nginx,比如:Netflix、GitHub、SoundCloud、MaxCDN等。
官方网站:http://www.nginx.org
今天,给大家介绍 Nginx 一个超牛逼的模块:split_clients。
手把手教你实现客户端流量分发,玩转 A/B 测试。

大家都知道,A/B 测试、灰度发布是现代软件工程中两大技术手段。
Nginx 的 split_clients 模块是专为流量分发设计的轻量级工具,常用于实现 A/B 测试、灰度发布或实验性功能验证。
其核心逻辑基于客户端标识(如 IP、用户代理、Cookie 等)生成哈希值,并按比例分配流量到不同后端组。
流量比例分配
根据预设百分比将流量导向不同后端或版本。例如,将 20% 流量导向新版本,80% 导向旧版本。
基于客户端标识
支持通过客户端 IP(remote_addr)、请求头(如 User-Agent)或自定义变量(如 request_id)作为哈希输入,确保同一客户端稳定分配到同一组。
灵活配置
可与 proxy_pass、root 等指令结合,实现动态路由或内容分发。
哈希计算:使用 MurmurHash2 算法 对输入字符串(如 IP + 固定后缀)进行哈希,生成一个 32 位无符号整数。
比例映射:将哈希值范围按百分比分割,例如:
$variant = .one)$variant = .two)$variant = "")http {
split_clients "${remote_addr}AAA"$variant {
50% .versionA;
50% .versionB;
}
server {
location / {
if ($variant = ".versionA") {
root /var/www/versionA;
}
if ($variant = ".versionB") {
root /var/www/versionB;
}
index index.html;
}
}
}
效果:客户端 IP 哈希后,50% 用户看到版本 A,50% 看到版本 B。
http {
split_clients "${remote_addr}AAA"$backend {
10% new_backend;
* old_backend;
}
upstream old_backend {
server 192.168.1.1:8080;
}
upstream new_backend {
server 192.168.1.2:8080;
}
server {
location / {
proxy_pass http://$backend;
}
}
}
效果:10% 流量导向新后端,90% 导向旧后端,实现渐进式发布。
http {
geoip_country /path/to/GeoIP.dat;
split_clients "$geoip_country_code${remote_addr}AAA"$region_backend {
US us_backend;
CN cn_backend;
* default_backend;
}
upstream us_backend { server 192.168.1.3:8080; }
upstream cn_backend { server 192.168.1.4:8080; }
upstream default_backend { server 192.168.1.5:8080; }
server {
location / {
proxy_pass http://$region_backend;
}
}
}
效果:根据客户端国家代码和 IP 哈希,将流量分配到地域专属后端。
模块安装:split_clients 需手动编译 Nginx 时添加 --add-module 参数启用,或确认版本已内置(如部分新版 Nginx)。
哈希一致性:输入字符串需包含固定后缀(如 AAA),避免因变量变化导致哈希波动。
比例精度:百分比总和需为 100%,剩余流量用 * 捕获。
性能影响:哈希计算开销极低,对高并发场景影响可忽略。
结合多个客户端变量(如 http_user_agent + cookie_user)实现更细粒度的分组,例如:
split_clients ${remote_addr}${http_user_agent} $experiment {
20% "control";
30% "variant_A";
50% "variant_B";
}
通过修改 Nginx 配置文件并执行 nginx -s reload 实时调整流量比例,无需重启服务。例如,将 B 组比例从 30% 提升至 50%:
split_clients ${remote_addr} $test_group {
50% "B";
* "A";
}
在 A/B 测试中,需确保同一用户的请求始终进入同一分组。可通过设置 Cookie 记录分组信息:
location / {
if ($test_group = "B") {
add_header Set-Cookie "test_group=B; path=/";
}
proxy_pass http://backend_$test_group;
}
通过 Nginx 日志记录分组变量 $test_group,结合 ELK、Prometheus 等工具分析不同分组的性能指标(如转化率、响应时间),评估实验效果。
Nginx Plus:商业版提供更高级的 A/B 测试功能(如基于请求参数的动态路由),但需付费。
OpenResty:基于 Lua 的流量分发方案,灵活性更高,但开发成本较高。
外部工具:如 Google Optimize、Optimizely 等 SaaS 工具,提供可视化 A/B 测试界面,但需引入外部依赖。
场景 | 实现方式 |
|---|---|
A/B 测试 | 按比例分配不同版本,对比用户行为 |
灰度发布 | 逐步增加新版本流量,降低风险 |
负载均衡 | 将流量分散到多个后端,避免单点过载 |
地域分流 | 结合 GeoIP 模块,按国家或地区分配后端 |
特性开关 | 通过变量控制部分用户访问新功能 |
通过 split_clients 模块,Nginx 能够以轻量级方式实现复杂的流量管理策略,是运维和开发人员优化用户体验、降低发布风险的得力工具。
👍 既然都看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~