news 2026/4/26 8:07:22

Nginx 按照流量比例反向代理配置详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx 按照流量比例反向代理配置详解

在灰度发布、A/B 测试等场景中,我们常需要将流量按一定比例分发到不同后端服务。Nginx 提供了split_clients模块,配合mapproxy_pass,可以轻松实现基于客户端特征的流量比例分配。本文将从Nginx 安装、Systemd 管理、完整配置到临时调试方案,提供一份可直接复制使用的完整教程。


一、Nginx 安装(Ubuntu 22.04)

说明:以下操作以 root 用户执行。

# 1. 卸载系统自带 nginxaptremove nginxaptpurge nginx nginx-common -y# 2. 更新系统并安装编译依赖sudoaptupdatesudoaptinstall-y libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev# 3. 下载并编译安装 Nginx(以 1.29.0 为例)wgethttp://nginx.org/download/nginx-1.29.0.tar.gzsudotar-zxvf nginx-1.29.0.tar.gzcdnginx-1.29.0/ ./configure --prefix=/usr/local/nginx/make&&makeinstall

默认安装路径为/usr/local/nginx/,主程序为/usr/local/nginx/sbin/nginx,配置文件为/usr/local/nginx/conf/nginx.conf


二、Nginx 的 systemd 管理文件

创建 systemd 服务文件/etc/systemd/system/nginx.service

[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target

启用并启动服务:

systemctl daemon-reexec systemctlenablenginx systemctl start nginx

三、完整的 Nginx 配置(按 50%:50% 比例分流)

配置文件路径:/usr/local/nginx/conf/nginx.conf

user root; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"'; # 定义 upstream 与 split_clients(保持原逻辑) upstream backend_primary { server bigdata.doubbjt.com; } upstream backend_secondary { server bigdata-h101.doubbjt.com; } split_clients "${remote_addr}${http_user_agent}" $backend { 50% backend_primary; 50% backend_secondary; } # 新增:动态映射 Host 头 map $backend $target_host { backend_primary "bigdata.doubbjt.com"; backend_secondary "bigdata-h101.doubbjt.com"; default "bigdata.doubbjt.com"; # 兜底策略 } server { listen 80; server_name bigdata-ai.doubbjt.com; access_log /var/log/nginx/access.log main; location / { proxy_pass http://$backend; proxy_set_header Host $target_host; # 关键修改:动态 Host 头 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }

核心要点

  • split_clients根据${remote_addr}${http_user_agent}哈希值决定流量走向;
  • map$backend映射为对应的Host值;
  • proxy_set_header Host $target_host确保后端收到正确的 Host 头,避免 404/403。

四、临时调试:关闭流量分配,强制走主环境

在测试阶段,若需临时让所有流量走backend_primary,可使用以下配置:

user root; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"'; # 定义 upstream 与 split_clients(保持原逻辑) upstream backend_primary { server bigdata.doubbjt.com; } upstream backend_secondary { server bigdata-h101.doubbjt.com; } ### split_clients "${remote_addr}${http_user_agent}" $backend { ### 50% backend_primary; ### 50% backend_secondary; ### } # 新增:动态映射 Host 头 map $backend $target_host { backend_primary "bigdata.doubbjt.com"; backend_secondary "bigdata-h101.doubbjt.com"; default "bigdata.doubbjt.com"; # 兜底策略 } server { listen 80; server_name bigdata-ai.doubbjt.com; access_log /var/log/nginx/access.log main; # 临时新增:强制所有流量指向 backend_primary set $backend "backend_primary"; location / { proxy_pass http://$backend; proxy_set_header Host $target_host; # 关键修改:动态 Host 头 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }

📌 调试完成后,删除set $backend "backend_primary";并取消注释split_clients块即可恢复分流。


五、验证方法

  • 访问测试
    curl-H"Host: bigdata-ai.doubbjt.com"http://<nginx服务器IP>/
  • 查看日志确认后端
    tail-f /var/log/nginx/access.log
    日志末尾的$upstream_addr字段将显示实际代理到的后端地址。

六、总结

本文提供了从安装到上线的完整 Nginx 流量比例反向代理方案,所有配置均为可运行的完整版本,无任何省略。通过split_clients + map + proxy_pass的组合,可安全、高效地实现灰度流量控制。

⚠️ 注意事项:

  • Nginx 必须编译时包含http_split_clients_module(默认已包含);
  • 流量比例是统计意义上的均匀分布,非逐请求轮询;
  • 如需用户粘性(同一用户始终访问同一后端),建议结合 Cookie 或应用层方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 18:21:40

Excel Ctrl+F 平替神器,小白躺平查数据(绿色版直装)

谁懂啊家人们&#xff01;明明只是想查个表格数据&#xff0c;却要被迫打开好几百兆的 Excel&#xff0c;等加载半天不说&#xff0c;CtrlF 搜完还得在密密麻麻的单元格里找结果&#xff0c;懒人真的会谢&#xff01; 直到我挖到这款Excel 数据查询绿色工具&#xff0c;直接把…

作者头像 李华
网站建设 2026/4/18 8:42:01

从 G1 到 G7:台式扫描电镜在稳定性与自动化上的技术演进

自 2006 年第一代 Phenom G1 台式扫描电镜推出以来&#xff0c;该系列已完成 7 代技术演进。2025 年&#xff0c;第七代旗舰 Phenom P 系列 G7&#xff08;Phenom ProX G7、Phenom Pro G7、Phenom Pure G7&#xff09;正式发布。 19 年产品迭代的核心目标始终明确&#xff1a;…

作者头像 李华
网站建设 2026/4/22 5:46:33

智能内容本地化革命:打造永久收藏的数字宝库

在数字阅读日益普及的今天&#xff0c;你是否曾因网络中断而无法继续阅读心爱的电子书&#xff1f;是否在旅途中因信号问题而错失宝贵的阅读时光&#xff1f;智能内容本地化工具正是为解决这些痛点而生&#xff0c;它将帮助你将云端阅读体验转化为永久收藏。 【免费下载链接】s…

作者头像 李华
网站建设 2026/4/18 8:20:21

【开题答辩全过程】以 基于SSM的考研信息共享平台为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/4/21 11:12:59

这才是SpirngBoot轻松整合MybatisPlus多数据源的正确打开方式

有一个这样子的需求&#xff0c;线上正在跑的业务&#xff0c;由于业务发展需要&#xff0c;需重新开发一套新系统&#xff0c;等新系统开发完成后&#xff0c;需要无缝对接切换&#xff0c;当初具体设计见草图。添加依赖#<!--lombok--><dependency><groupId>…

作者头像 李华
网站建设 2026/4/21 5:27:19

Windows系统PostgreSQL向量搜索终极指南:快速部署与实战应用

Windows系统PostgreSQL向量搜索终极指南&#xff1a;快速部署与实战应用 【免费下载链接】pgvector Open-source vector similarity search for Postgres 项目地址: https://gitcode.com/GitHub_Trending/pg/pgvector 想要在Windows环境下为PostgreSQL数据库添加强大的A…

作者头像 李华