Nginx反向代理与负载均衡配置详解:从单机转发到多后端故障切换实战
开场:先把“代理”和“负载均衡”这两个概念掰直
哈喽兄弟们,今天这期我们直接上实战!你看着屏幕,我一步一步搭给你看。OK so,Nginx 反向代理本质上就是:客户端只认识 Nginx,Nginx 再帮你把请求转给后面的真实服务;负载均衡则是在多个后端之间分配流量,别让一台机器被打爆。
先说一个最常见的场景:你有两个后端,分别跑在 127.0.0.1:3001 和 127.0.0.1:3002,前面放一个 Nginx。这样做的好处很直接:统一入口、隐藏真实端口、方便做 HTTPS、也方便做灰度和故障切换。很多人搜“nginx反向代理教程”时,卡的不是语法,而是不知道为什么配完还是 502。下面我把根因和排查顺序一起讲透。
第一段:反向代理最小可用配置,先跑起来再优化
接下来我直接打开 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。
第二段:负载均衡三种常用策略,直接看效果
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,按这个顺序查,效率最高:
- 先看后端进程是否真的在监听端口:
ss -lntp | grep 3001 - 再本机直连后端:
curl -I http://127.0.0.1:3001 - 看 Nginx 配置语法:
nginx -t - 重载配置:
nginx -s reload - 查看错误日志:
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 反代”的实战,评论区敲出来,我直接按你们最常卡的点继续拆。