Nginx 反向代理与负载均衡实战(基于陶辉《深入理解 Nginx》第三章)
Nginx 反向代理与负载均衡实战基于陶辉《深入理解 Nginx》第三章本文所有命令输出均来自两台真实云服务器Ubuntu 24.04.4 / nginx 1.24.0的现场回显未做任何编造。拓扑目标一台代理层把流量按多种策略转发给上游的多个后端并具备故障自动转移能力。一、实验拓扑公网 / 客户端 │ ┌────────▼────────┐ │ 代理层 PROXY │ 139.9.***.*** (公网) │ 192.168.0.149 │ nginx 1.24.0 │ upstream │ │ proxy_pass │ └────────┬─────────┘ 内网 192.168.0.xVPC 互通走内网不占公网带宽 │ ┌────────▼────────┐ │ 上游层 UPSTREAM │ 119.3.***.*** (公网) │ 192.168.0.113 │ nginx 1.24.0 │ 3 个后端: │ │ 8081/8082/8083 │ └──────────────────┘代理层承担「反向代理 负载均衡」对外只暴露 80/443内网回源走192.168.0.113。上游层用 3 个独立server块模拟 3 台应用服务器各自返回可区分的身份头X-Backend方便观察分发结果。二、环境准备两台机器两台均用发行版自带的 nginxapt 安装无需编译版本与运行状态如下$ nginx-vnginx version: nginx/1.24.0(Ubuntu)$ systemctl is-active nginx active $ ss-ltn|grep:80LISTEN05110.0.0.0:800.0.0.0:* LISTEN0511[::]:80[::]:*上游层部署 3 个后端/etc/nginx/conf.d/backends.conf节选server { listen 8081; server_name _; default_type text/plain; add_header X-Backend backend-8081; location / { return 200 backend-8081 served at $time_local\n; } } # 8082 / 8083 结构相同仅端口与标识不同本地验证三个后端均可独立响应$curl-s-ihttp://127.0.0.1:8081/|head-8HTTP/1.1200OK Server: nginx/1.24.0(Ubuntu)Content-Type: text/plain X-Backend: backend-8081 $curl-shttp://127.0.0.1:8082/api/health OK backend-8082 $ ss-ltn|grep-E:808[123]LISTEN05110.0.0.0:80810.0.0.0:* LISTEN05110.0.0.0:80830.0.0.0:* LISTEN05110.0.0.0:80820.0.0.0:*代理层先确认能通过内网访问到上游这是生产最佳实践回源走内网省公网带宽、低延迟$curl-s-ihttp://192.168.0.113:8081/|head-6HTTP/1.1200OK Server: nginx/1.24.0(Ubuntu)Content-Type: text/plain Content-Length:50Connection: keep-alive三、反向代理基础proxy_pass反向代理的核心只有一行proxy_pass它把客户端请求转发给 upstream 定义的后端组# /etc/nginx/conf.d/proxy_upstreams.conf upstream backend_rr { zone backend_rr 64k; server 192.168.0.113:8081; server 192.168.0.113:8082; server 192.168.0.113:8083; }# /etc/nginx/conf.d/proxy_lb.conf server { listen 80; server_name _; add_header X-Upstream $upstream_addr always; # 透出实际选中的后端 location / { proxy_pass http://backend_rr; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }proxy_set_header三件套非常关键X-Real-IP/X-Forwarded-For把真实客户端 IP 透传给后端否则后端access.log里全是代理 IP。Host $host保留原始 Host避免后端因 Host 不匹配而走默认站点。X-Forwarded-Proto告知后端原始协议http/https对生成重定向链接、校验安全 cookie 很重要。从公网直接访问代理的 80 端口请求被转发到内网后端并回传身份头$curl-s-ihttp://139.9.***.***/|grep-iEX-Backend|X-Upstream|HTTP/HTTP/1.1200OK X-Backend: backend-8081 X-Upstream:192.168.0.113:8081X-Backend来自上游后端X-Upstream来自代理层$upstream_addr——两个头合起来一条请求从「客户端 → 代理 → 哪个后端」的链路就一目了然。四、负载均衡算法逐一验证代理层同时开了 4 个端口分别绑定不同算法的 upstream便于横向对比端口算法upstream80默认轮询 round-robinbackend_rr8091加权轮询 weightedbackend_weighted8092ip_hash 一致性哈希backend_iphash8093最少连接 least_connbackend_leastconn⚠️踩坑与最佳实践最开始我没有给upstream加zone指令结果多 worker 下轮询状态各自独立连续 9 次请求里 8 次都打到了backend-8081--1-- X-Backend: backend-8081 / X-Upstream: 192.168.0.113:8081 ...2~8 同样 --9-- X-Backend: backend-8082 / X-Upstream: 192.168.0.113:8082加上zone backend_rr 64k;后把节点状态放进共享内存分发立刻均衡见下。生产环境强烈建议所有 upstream 都加zone它还能支持运行时增删节点upstream_conf。1) 默认轮询round-robin$foriin$(seq130);docurl-s-ihttp://127.0.0.1:80/|grep-iX-Backend|tr-d\r;done|sort|uniq-c10X-Backend: backend-808110X-Backend: backend-808210X-Backend: backend-8083三个后端严格 1:1:1符合 round-robin 的加权轮询默认权重相等。2) 加权轮询weightupstream backend_weighted { zone backend_weighted 64k; server 192.168.0.113:8081 weight3; server 192.168.0.113:8082 weight1; server 192.168.0.113:8083 weight1; }$foriin$(seq120);docurl-s-ihttp://127.0.0.1:8091/|grep-iX-Backend|tr-d\r;done|sort|uniq-c12X-Backend: backend-80814X-Backend: backend-80824X-Backend: backend-808312:4:4 3:1:1与配置权重完全吻合。当某台机器性能好、或某实例权重高时用weight把更多流量分给它。3) 最少连接least_connupstream backend_leastconn { zone backend_leastconn 64k; least_conn; server 192.168.0.113:8081; server 192.168.0.113:8082; server 192.168.0.113:8083; }$foriin$(seq130);docurl-s-ihttp://127.0.0.1:8093/|grep-iX-Backend|tr-d\r;done|sort|uniq-c10X-Backend: backend-808110X-Backend: backend-808210X-Backend: backend-8083本例请求都极轻量连接数始终为 0所以退化为均匀分发。least_conn的真正价值在「请求耗时不均」的场景谁最闲分谁避免慢请求把某台机器堆满。它同样常与zone搭配。4) ip_hash 一致性哈希upstream backend_iphash { zone backend_iphash 64k; ip_hash; server 192.168.0.113:8081; server 192.168.0.113:8082; server 192.168.0.113:8083; }$foriin1234;docurl-s-ihttp://127.0.0.1:8092/|grep-iX-Backend|tr-d\r;doneX-Backend: backend-8083 X-Backend: backend-8083 X-Backend: backend-8083 X-Backend: backend-8083同一客户端 IP 始终落到同一后端——这正是「会话保持 / 粘性」的需求场景如未做分布式 Session 时让用户总是命中同一台缓存了状态的应用。注意ip_hash是按$remote_addr哈希若前端还有 CDN/反向代理需配合X-Forwarded-For的real_ip模块才能拿到真实客户端 IP。五、故障自动转移failover负载均衡不只是「分发」更是「容错」。当某后端不可达时Nginx 默认通过proxy_next_upstream把请求重试到下一个健康节点。我们在上游层用iptables把 8082 端口「拒绝」掉模拟该后端宕机$ iptables-IINPUT-ptcp--dport8082-jREJECT;echoadded added $ iptables-LINPUT-n|grep8082REJECT6--0.0.0.0/00.0.0.0/0 tcp dpt:8082 reject-with icmp-port-unreachable此时从代理层连续请求 12 次$foriin$(seq112);docurl-s-ihttp://127.0.0.1:80/|grep-iX-Backend|tr-d\r;done|sort|uniq-c6X-Backend: backend-80816X-Backend: backend-8083死掉的8082一次都没出现流量被自动切到8081与8083。恢复后移除规则$ iptables-DINPUT-ptcp--dport8082-jREJECT;echoremoved removed $ iptables-LINPUT-n|grep8082||echonone none说明开源版 Nginx 没有「主动健康检查」health_check需商业版 Nginx Plus。这里的 failover 依赖被动健康检查——只有当连接/超时/返回错误proxy_next_upstream默认的error timeout发生时才换节点。生产环境可结合max_fails/fail_timeout让节点被「熔断」一段时间或用第三方模块做主动探活。六、小结反向代理proxy_passproxy_set_header透传 Host / 真实 IP / 协议即可回源优先走内网。负载均衡round-robin 默认均分weight调权重least_conn按连接数选闲ip_hash做会话保持。四者都在upstream块内声明。两个关键经验upstream务必加zone—— 否则多 worker 下分发会严重偏斜实测 9 次里 8 次打同一台。failover 默认开启proxy_next_upstream但属于被动健康检查高可用需额外探活机制。下一篇我们将基于这套拓扑继续实战反向代理缓存与HTTPS HTTP/2。

相关新闻

Video DownloadHelper CoApp终极指南:5个技巧轻松下载网络视频

Video DownloadHelper CoApp终极指南:5个技巧轻松下载网络视频

Video DownloadHelper CoApp终极指南:5个技巧轻松下载网络视频 【免费下载链接】vdhcoapp Companion application for Video DownloadHelper browser add-on 项目地址: https://gitcode.com/gh_mirrors/vd/vdhcoapp Video DownloadHelper CoApp是Video Downl…

2026/7/27 0:10:27阅读更多 →
Nginx 源码编译与静态资源服务器实战 —— 基于陶辉《Nginx 核心知识 150 讲》第一、二章

Nginx 源码编译与静态资源服务器实战 —— 基于陶辉《Nginx 核心知识 150 讲》第一、二章

Nginx 源码编译与静态资源服务器实战 —— 基于陶辉《Nginx 核心知识 150 讲》第一、二章 本文所有命令均在真实服务器(华为云 FlexusX 8C16G / Ubuntu 24.04)上执行,所有回显均来自真实环境,未做任何虚构与篡改(仅对超…

2026/7/27 0:10:27阅读更多 →
嵌入式USB控制器寄存器编程实战:从HOST_RXCSR到FIFO配置

嵌入式USB控制器寄存器编程实战:从HOST_RXCSR到FIFO配置

1. 项目概述与核心价值在嵌入式系统开发中,USB控制器是实现设备与主机通信的核心硬件模块。其工作原理基于寄存器编程,通过配置特定的控制状态寄存器来管理数据传输、错误处理和端点行为。这种寄存器级控制为开发者提供了精细化的硬件操作能力&#xff0…

2026/7/27 0:08:26阅读更多 →
AM1806 GPIO与PRUSS实战:硬实时嵌入式系统开发指南

AM1806 GPIO与PRUSS实战:硬实时嵌入式系统开发指南

1. 项目概述:深入AM1806的GPIO与PRUSS核心在嵌入式系统开发中,尤其是工业控制、电机驱动和高速数据采集这类对实时性有严苛要求的领域,主处理器(如ARM)的通用性有时会与确定性响应需求产生矛盾。这时,一个能…

2026/7/27 1:40:43阅读更多 →
C++面试核心25题:从语言基础到设计模式的深度解析与避坑指南

C++面试核心25题:从语言基础到设计模式的深度解析与避坑指南

1. 项目概述:为什么是这25道题? 在C技术面试的战场上,我见过太多候选人,他们刷了成百上千道题,LeetCode周赛排名靠前,但面对面试官一个看似基础的追问,却常常卡壳,暴露了知识体系的…

2026/7/27 1:40:43阅读更多 →
AM1806引脚复用配置实战:从架构解析到避坑指南

AM1806引脚复用配置实战:从架构解析到避坑指南

1. 项目概述在嵌入式硬件开发中,尤其是基于德州仪器(TI)AM1806这类高度集成的ARM微控制器进行设计时,引脚复用配置往往是项目成败的第一个技术门槛。很多工程师拿到芯片手册,面对动辄数百页的引脚功能描述表格&#xf…

2026/7/27 1:40:43阅读更多 →
用 Dataify 网页采集 API 做一次网页数据提取:从选择采集工具到导出结构化结果

用 Dataify 网页采集 API 做一次网页数据提取:从选择采集工具到导出结构化结果

一、为什么这次不用传统采集工具手写解析? 在做电商分析、竞品监测、广告落地页观察、舆情跟踪或者 AI 数据准备时,经常会遇到一个很基础的需求:从网页里提取结构化数据。 比如从一个商品详情页里提取商品标题、价格、评分、评论数、规格参数…

2026/7/27 1:40:43阅读更多 →
嵌入式DSP开发:Tconf配置工具的核心原理与工程实践

嵌入式DSP开发:Tconf配置工具的核心原理与工程实践

1. 项目概述:Tconf,一个被低估的嵌入式配置利器在嵌入式开发,尤其是DSP(数字信号处理器)应用开发中,我们常常面临一个核心矛盾:软件逻辑需要高度的可移植性和可维护性,而硬件配置&am…

2026/7/27 1:40:43阅读更多 →
SSA优化BP神经网络:电力负荷预测实战

SSA优化BP神经网络:电力负荷预测实战

1. 项目概述:当麻雀遇上神经网络去年在做一个电力负荷预测项目时,我遇到了所有机器学习工程师都头疼的问题——BP神经网络的预测精度始终卡在某个瓶颈无法突破。在尝试了各种调参技巧后,偶然读到一篇关于麻雀搜索算法(Sparrow Sea…

2026/7/27 1:38:43阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/27 1:14:34阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/27 1:14:52阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/27 1:14:56阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:24阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:24阅读更多 →
2007-2023年各市区县生态文明建设示范区DID

2007-2023年各市区县生态文明建设示范区DID

数据简介 自改革开放以来,我国依赖高投入、高资源消耗和高污染等传统发展模式实现了经济短期内的快速增长, 然而这也导致了严重的生态环境危机。因此,国家有力于推动企业高质量经济发展,协同生态保护的方针,从而从201…

2026/7/27 0:00:24阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →