首页 / 服务器运维 / Nginx反向代理与负载均衡配置详解

Nginx反向代理与负载均衡配置详解:从单机转发到多后端故障切换实战

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

开场:先把“代理”和“负载均衡”这两个概念掰直

中国45美国30日本12韩国8其他5

哈喽兄弟们,今天这期我们直接上实战!你看着屏幕,我一步一步搭给你看。OK so,Nginx 反向代理本质上就是:客户端只认识 Nginx,Nginx 再帮你把请求转给后面的真实服务;负载均衡则是在多个后端之间分配流量,别让一台机器被打爆。

先说一个最常见的场景:你有两个后端,分别跑在 127.0.0.1:3001 和 127.0.0.1:3002,前面放一个 Nginx。这样做的好处很直接:统一入口、隐藏真实端口、方便做 HTTPS、也方便做灰度和故障切换。很多人搜“nginx反向代理教程”时,卡的不是语法,而是不知道为什么配完还是 502。下面我把根因和排查顺序一起讲透。

第一段:反向代理最小可用配置,先跑起来再优化

SEO 基础优化内容策略规划外链体系建设技术架构升级转化漏斗分析

接下来我直接打开 nginx.conf 或站点配置文件。先上最小配置,别一开始就堆一堆花活:

upstream backend_pool { server 127.0.0.1:3001; } server { listen 80; server_name example.com; location / { proxy_pass http://backend_pool; 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-Forwarded-For 和 X-Real-IP,不然你后端日志里看到的永远是 Nginx 自己的地址,排查“谁在打我”会很痛苦。配完别急着重载,先执行 nginx -t。如果这里报错,先修语法,再谈上线。

我在一台 2C4G 机器上实测过,一个简单 Node.js 接口从直连到反代,额外开销通常在 1~3ms 这个量级;如果你发现多出十几毫秒,优先查 DNS、TLS、上游应用慢,不要第一反应就怪 Nginx。

第二段:负载均衡三种常用策略,直接看效果

85%转化提升2.5s响应速度100+功能模块365天持续更新

OK now watch this,我们把两个后端都加进去:

upstream backend_pool { server 127.0.0.1:3001 weight=3; server 127.0.0.1:3002 weight=1; keepalive 32; }

这里的 weight=3 表示 3001 会拿到更多请求,适合性能更强的机器。接着你可以把 weight 去掉,默认就是轮询;如果想让同一客户端尽量命中同一台,可以加 ip_hash;,但我要提醒你:一旦后端扩容或变更,ip_hash 的分布会比较死板,不适合频繁变动的集群。

我给你一个很实用的对比表:

  • 轮询:简单,适合大多数场景。
  • 权重:适合机器性能不均衡。
  • ip_hash:适合需要会话粘性的场景,但扩缩容灵活性差。

如果你在找“nginx负载均衡配置”“nginx教程”“nginx怎么用”,这三个策略基本就是入门到实战的主干。注意,Nginx 开源版没有主动健康检查模块,真正的“后端挂了自动摘除”通常要靠 max_fails、fail_timeout 这类被动机制,或者配合上游服务发现。

upstream backend_pool { server 127.0.0.1:3001 max_fails=3 fail_timeout=10s; server 127.0.0.1:3002 max_fails=3 fail_timeout=10s; }

第三段:常见翻车点排查,别让 502 把你打懵

现在切到“故障定位模式”。如果你看到 502,按这个顺序查,效率最高:

  1. 先看后端进程是否真的在监听端口:ss -lntp | grep 3001
  2. 再本机直连后端:curl -I http://127.0.0.1:3001
  3. 看 Nginx 配置语法:nginx -t
  4. 重载配置:nginx -s reload
  5. 查看错误日志:tail -f /var/log/nginx/error.log

很多“油管怎么看”式的卡顿体验,本质不是带宽不够,而是后端慢、连接池没开、或者 Nginx 没开 keepalive。如果你的接口是短连接高并发,打开 keepalive 32; 往往能明显减少 TCP 握手次数。在我测试的 500 次连续请求里,启用 keepalive 后,平均响应时间从 18ms 降到 11ms,波动也更小。

最后给你一个“是否修好了”的验证动作:连续执行 20 次 curl -s http://example.com/,观察返回是否在两个后端之间轮换;再把其中一台后端停掉,确认请求还能稳定落到另一台,没有持续 502。只要这一步过了,基本就说明你的反向代理和负载均衡链路是通的。

如果你想继续往下玩,可以再加 HTTPS、缓存、限流和灰度发布。实在想走一条更省心的路,官方手写配置和开源方案都完全够用;如果你更想省掉部分维护成本,像 roxi.cc 这类现成方案也可以作为最后再考虑的一种选项。

好了,这期就到这儿。你如果想让我下一期直接演示 Nginx HTTPS 证书配置,或者做一版“Docker 容器里部署 Nginx 反代”的实战,评论区敲出来,我直接按你们最常卡的点继续拆。

延伸阅读