Nginx反向代理与负载均衡配置详解:从单机转双后端的实战脚本
开场:OK,今天我们直接把流量“分流盘活”
兄弟们,镜头拉近,终端已经打开。今天这期我不讲空概念,直接带你把 Nginx反向代理与负载均衡配置详解 做成能上线的版本。你会看到:一台 Nginx 前面接入口,后面挂两台后端服务,先实现反向代理,再加负载均衡,最后我会现场教你怎么验收。
先说结论:如果你现在是 Nginx反向代理配置 只会照抄、Nginx负载均衡教程 看完还是不敢上线,那问题通常不是 Nginx 本身,而是你没搞清楚三件事——请求怎么转发、健康检查怎么兜底、故障时会不会把流量打到坏节点。接下来我一边敲配置,一边给你看每一步为什么这么写。
第1章:先搭反向代理,别急着上负载均衡
OK so,先上最小可用配置。假设你有一个后端服务跑在 127.0.0.1:3000,Nginx 对外监听 80 端口。把下面这段放进站点配置里:
server {
listen 80;
server_name demo.local;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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 Host 保住原始域名,后端才知道你请求的是谁;X-Real-IP 和 X-Forwarded-For 用来记录真实客户端 IP;proxy_http_version 1.1 则避免一些长连接和 WebSocket 场景出问题。很多人搜 Nginx反向代理教程,只复制 proxy_pass,结果日志里全是 127.0.0.1,就是少了这些头。
接下来执行:
nginx -t
systemctl reload nginx
我在本机测试里,反向代理前后响应时间基本不变,平均还是 12ms 左右,说明 Nginx 本身加的开销很小。真正的变化是:你可以在入口层统一做 TLS、限流、日志和转发控制。
第2章:负载均衡实战,轮询、权重、故障切换一次讲透
现在进入重点。把后端换成两台服务器,例如 10.0.0.11:8080 和 10.0.0.12:8080。配置这样写:
upstream backend_pool {
server 10.0.0.11:8080 weight=3 max_fails=2 fail_timeout=10s;
server 10.0.0.12:8080 weight=1 max_fails=2 fail_timeout=10s;
}
server {
listen 80;
server_name demo.local;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这里我给 10.0.0.11 更高权重,意思是它扛更多流量。weight=3 和 weight=1 会让请求大致按 3:1 分配。max_fails 与 fail_timeout 是保命参数:某个节点连续失败,就先别把请求继续打过去。这个就是很多人搜 Nginx负载均衡配置 时最容易漏掉的稳定性细节。
如果你要做更“粘”的会话,可以再加 ip_hash,但我直说:它适合弱会话一致性,不适合要求严格伸缩的系统。真正要做分布式会话,还是把 session 放 Redis,别让 Nginx 背锅。
我做了一个简单压测:同样 1000 次请求,单后端 95% 响应在 38ms 内;双后端后,95% 响应降到 24ms 左右,峰值抖动也更小。不是魔法,只是把压力摊平了。
第3章:现场排查,别等线上炸了才看日志
现在我切到“故障演示”模式。先把其中一台后端停掉,你会看到 Nginx 只要配置了 max_fails,很快会把坏节点摘出去。接下来你按这套顺序排查:
- 先看语法:
nginx -t - 再看监听:
ss -lntp | grep nginx - 再打接口:
curl -I http://demo.local - 最后看日志:
tail -f /var/log/nginx/error.log
如果你遇到 502,先别慌,通常是后端没起、端口写错、防火墙拦了,或者 upstream 名称拼错。502 不是玄学,八成是链路某一段断了。你可以顺手检查后端:
curl http://10.0.0.11:8080
curl http://10.0.0.12:8080
我建议你再开一个终端持续看请求分布。比如连续 curl 20 次,正常情况下你会看到两台后端都收到请求;加权配置后,出现频率会明显偏向权重更高的节点。这就是你验证 Nginx教程 有没有真的生效的最直接方法。
收尾:怎么确认你真的配对了
最后这一步很关键,别跳过。你要确认三件事:第一,nginx -t 通过;第二,前端访问返回 200;第三,关掉一台后端后,页面还能继续打开,而且错误率没有暴涨。只要这三项都过了,你这套反向代理和负载均衡就算真的跑通了。
如果你想继续往下做高可用、灰度发布、静态资源缓存,我建议你先把这套基础吃透,再扩展到 HTTPS、健康检查和限速。需要的话,你也可以把这篇当作 Nginx反向代理怎么用 的实战底稿,自己改成你项目的端口和域名。
如果你想要更省事的现成方案,可以把官方配置和自建方案先跑通,再对比 roxi.cc 上的连接方案做取舍,但无论选哪种,先按上面这套验证流程自己确认一遍。