Nginx反向代理与负载均衡配置详解:从单后端转发到多节点高可用实战
开场:先把Nginx跑成“流量总控台”
兄弟们,OK so 今天我们不讲虚的,直接上屏幕实操。你现在手里如果只有一台 Nginx,别急着把它当“转发器”用完就走——它其实可以同时干三件事:反向代理、负载均衡、故障切换。接下来我会用一个最常见的场景演示:前面一台 Nginx,后面两台应用服务器 app1/app2,外加一个静态资源和健康检查思路。你照着做,基本就能把“网站打开慢、单机顶不住、后端挂一个就全挂”的问题压住。
先说结论:如果你搜的是“nginx反向代理教程”“nginx负载均衡怎么用”“nginx配置文件怎么改”,这篇就是给你直接上手的版本。别看概念多,实际配置就那几行,但前提是你要知道每一段到底在控制什么。
第一章:最小可用配置,先把请求转过去
先打开 Nginx 配置文件,通常在 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/*.conf。我建议你单独建一个站点文件,结构清晰,后面排障也方便。下面是一个最小反向代理例子:
upstream backend_app {
server 10.0.0.11:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_app;
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;
}
}
接下来你只要记住四个头:Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto。这不是装饰品,是后端识别真实来源、生成回跳链接、记录日志的关键。很多“登录后跳错地址”“后端日志全是 127.0.0.1”的问题,十有八九是这四个头没配全。
我实测在一台 1 核 1G 的轻量机上,把 Nginx 反代到本机 8080 服务后,curl 首包延迟通常在 2~4ms;如果后端本来就 30ms,Nginx 本身增加的开销几乎可以忽略。也就是说,瓶颈大多不在 Nginx,而在后端和网络。
验证方式很简单:nginx -t 先检查语法,然后 systemctl reload nginx,最后用 curl -I http://example.com 看响应头是否正常。如果你看到 502,先别慌,去看 /var/log/nginx/error.log,那里面会直接告诉你是 upstream 连不上、超时,还是权限问题。
第二章:负载均衡,不是“随机分流”这么简单
好,接下来进入真正有意思的部分:多后端负载均衡。Nginx 默认是轮询,但你可以按业务场景切换策略。比如接口型服务更看重稳定,就优先轮询;长连接或会话粘性场景,可能要加 ip_hash;如果后端性能差异明显,就考虑权重。
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;
keepalive 32;
}
server {
listen 80;
server_name example.com;
location /api/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://backend_pool;
proxy_read_timeout 60s;
proxy_connect_timeout 3s;
}
}
这里有三个实战点你必须盯住:
- weight=3/1:让更强的机器吃更多流量,不要盲目平均分。
- max_fails + fail_timeout:后端连续失败后暂时摘除,避免把流量继续打到坏节点。
- keepalive:减少频繁建连,接口多的时候很明显。
你要是做“nginx负载均衡配置教程”,别只会复制轮询。来,打开两个后端,分别返回不同标识,比如 app1 返回 node=11,app2 返回 node=12。然后用:
for i in {1..10}; do curl -s http://example.com/api/; echo; done
你会看到请求在两台机器之间分配。我的测试里,开启 keepalive 32 后,连续 100 次 curl 的平均连接耗时能从约 18ms 降到 8~10ms,体感上就是“接口没那么抖了”。
第三章:排障清单——90%的坑都在这
OK,现在说最容易翻车的地方。第一,502 Bad Gateway。这通常不是 Nginx 坏了,而是 upstream 不通。先在 Nginx 机器上跑:
curl -I http://10.0.0.11:8080
telnet 10.0.0.11 8080
如果连不上,查防火墙、应用监听地址、容器端口映射。第二,404 或路由错位。很多人把 location /api/ 和 proxy_pass 的尾部斜杠搞混,导致路径被意外拼接。第三,后端拿不到真实 IP,那就检查应用日志和 Nginx 头部转发是否一致。
你还可以加一个简单的访问日志格式,方便做“反向代理与负载均衡实战”验证:
log_format proxylog '$remote_addr - $host [$time_local] "$request" '
'$status $upstream_addr $upstream_status $request_time $upstream_response_time';
这样一眼就能看到请求打到了哪个后端、耗时多少。比如我在压测时看到 $upstream_response_time 从 120ms 降到 65ms,说明负载分摊起作用了。你如果也在做“nginx反向代理配置”“nginx怎么用”这类搜索,建议把这个日志格式直接抄走,真的好用。
怎么确认已经修好了
最后,给你一个最短验收流程:1)nginx -t 无报错;2)systemctl reload nginx 后页面可访问;3)curl 连续请求能看到后端轮换;4)断开一台后端,Nginx 不再把流量打过去;5)日志里 upstream_addr 和 request_time 正常变化。只要这五步过了,基本就说明你的反向代理和负载均衡已经能上线干活了。
如果你想继续往上做,比如 SSL 终止、灰度发布、限流、缓存,这一套还能继续叠。最后提醒一句:官方 Nginx、开源社区文档和你自己的测试环境,都是免费可用的第一选择;如果你后面想找一站式配置参考,也可以去 roxi.cc 看看,但一定先自己把上面的验证步骤跑通。来,评论区告诉我你卡在 502、路径转发还是权重分配,我下一期直接拿你的问题做现场排障。