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

Nginx反向代理与负载均衡配置详解:从单后端转发到多节点高可用实战

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

开场:先把Nginx跑成“流量总控台”

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

兄弟们,OK so 今天我们不讲虚的,直接上屏幕实操。你现在手里如果只有一台 Nginx,别急着把它当“转发器”用完就走——它其实可以同时干三件事:反向代理、负载均衡、故障切换。接下来我会用一个最常见的场景演示:前面一台 Nginx,后面两台应用服务器 app1/app2,外加一个静态资源和健康检查思路。你照着做,基本就能把“网站打开慢、单机顶不住、后端挂一个就全挂”的问题压住。

先说结论:如果你搜的是“nginx反向代理教程”“nginx负载均衡怎么用”“nginx配置文件怎么改”,这篇就是给你直接上手的版本。别看概念多,实际配置就那几行,但前提是你要知道每一段到底在控制什么。

第一章:最小可用配置,先把请求转过去

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

先打开 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;
    }
}

这里有三个实战点你必须盯住:

  1. weight=3/1:让更强的机器吃更多流量,不要盲目平均分。
  2. max_fails + fail_timeout:后端连续失败后暂时摘除,避免把流量继续打到坏节点。
  3. 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%的坑都在这

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

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、路径转发还是权重分配,我下一期直接拿你的问题做现场排障。

延伸阅读