news 2026/7/7 20:06:03

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/7/7 6:34:26

【VSCode量子开发插件集成指南】:掌握未来编程的5大核心工具

第一章&#xff1a;VSCode量子开发插件集成概述 随着量子计算从理论研究逐步走向工程实践&#xff0c;开发者对高效、集成化开发环境的需求日益增长。Visual Studio Code&#xff08;VSCode&#xff09;凭借其强大的扩展生态和轻量级架构&#xff0c;成为量子软件开发的重要平台…

作者头像 李华
网站建设 2026/7/6 22:23:56

揭秘VSCode量子计算插件:如何一键批量提交Q#作业并提升开发效率

第一章&#xff1a;VSCode 量子作业的批量提交在现代量子计算开发中&#xff0c;使用 VSCode 结合量子 SDK 进行本地编程已成为主流工作流。当需要向量子云平台批量提交多个量子电路作业时&#xff0c;手动逐个提交效率低下且容易出错。通过配置任务脚本与扩展插件协同工作&…

作者头像 李华
网站建设 2026/7/7 6:46:48

Textractor终极指南:高效游戏文本提取与本地化实战教程

Textractor终极指南&#xff1a;高效游戏文本提取与本地化实战教程 【免费下载链接】Textractor Textractor: 是一个开源的视频游戏文本钩子工具&#xff0c;用于从游戏中提取文本&#xff0c;特别适用于Windows操作系统。 项目地址: https://gitcode.com/gh_mirrors/te/Text…

作者头像 李华
网站建设 2026/7/7 11:54:47

为什么你的量子算法总出错?:从VSCode日志中发现的5个隐藏陷阱

第一章&#xff1a;量子算法的 VSCode 日志分析在开发和调试量子算法时&#xff0c;日志记录是理解程序行为、识别错误来源的关键工具。Visual Studio Code&#xff08;VSCode&#xff09;凭借其强大的扩展生态和内置终端支持&#xff0c;成为量子计算开发者常用的集成开发环境…

作者头像 李华
网站建设 2026/7/7 14:28:17

好写作AI释义者:如何把“学术黑话”翻译成“人话”?

有没有经历过这样的时刻&#xff1f;你盯着自己的数据图表&#xff0c;感觉发现了一个新世界&#xff0c;但写出来却像天书&#xff1b;或者&#xff0c;你在理论上绕了三圈&#xff0c;写出的句子自己读第二遍都不知所云——别担心&#xff0c;这恰恰是思想深刻的标志&#xf…

作者头像 李华
网站建设 2026/7/6 13:14:20

DeepChem分子特征工程:终极实战指南与性能优化

DeepChem分子特征工程&#xff1a;终极实战指南与性能优化 【免费下载链接】deepchem Democratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology 项目地址: https://gitcode.com/gh_mirrors/de/deepchem 引言&#xff1a;突破…

作者头像 李华