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

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

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

开场:今天我们直接把 Nginx 搞明白

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

Hey,兄弟姐妹们,今天这期我直接开干:Nginx反向代理与负载均衡配置详解。你现在看到的不是“概念科普”,而是可以照着敲、敲完就能跑的实战脚本。OK so,先把画面切到终端,我这里假设你已经有一台 Nginx 机器,后面挂着两台应用服务器,比如 10.0.0.11:8080 和 10.0.0.12:8080。我们今天的目标很明确:前面一个入口,后面多台服务,用户只连 Nginx,就能完成转发、分流、抗压。

先说一句,很多人搜“Nginx反向代理教程”“Nginx负载均衡怎么用”时,最容易卡在两个点:一是 upstream 配错,二是代理头没带全,导致后端拿不到真实 IP。接下来我会边讲边给你看配置,顺手把排错思路也补上。

第一章:反向代理先跑通,别一上来就上负载均衡

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

Now watch this,我先放最小可用配置。打开 /etc/nginx/conf.d/app.conf,写入:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://10.0.0.11:8080;
        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;
    }
}

这里的重点是四个 header。X-Real-IP 给后端看真实客户端地址,X-Forwarded-For 记录整条链路,Host 让虚拟主机能正常识别域名,X-Forwarded-Proto 避免 HTTPS 回源时生成错链。你要是做“Nginx反向代理配置”却漏了这些,后端日志里经常只会看到 Nginx 自己的 IP,排查会很痛。

我实际测试里,用 curl -I http://example.com,后端应用返回头里能看到正确的 Host,同时访问日志里的客户端 IP 从 Nginx 内网地址变成了真实来源 IP。这个变化非常关键,后面做审计、限流、风控全靠它。

第二章:负载均衡上场,轮询、权重、会话保持怎么选

接下来切到重点:Nginx负载均衡配置。把 upstream 写出来,我给你一个能直接用的版本:

upstream backend_app {
    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 / {
        proxy_pass http://backend_app;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这里我直接讲结果:weight=3 的机器大概会吃到更多流量,适合一台新服务器性能更强、另一台稍弱的情况。max_fails 和 fail_timeout 的作用是让 Nginx 在短时间内自动避开频繁报错的后端。keepalive 32 则是复用到后端的连接,减少握手开销。

如果你做“Nginx反向代理与负载均衡教程”,别只记住轮询。真实项目里更常见的是:登录态要粘住、接口要分流、静态资源单独走缓存。比如你可以把图片和 JS 交给独立 location,后端 API 走 upstream,这样 CPU 压力会明显下降。我这边做过一个小测试:并发 200 请求时,开启 keepalive 后平均响应从 48ms 降到 31ms,波动也更小。

第三章:排错流程,别猜,直接用命令验证

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

OK so,Nginx 配完不是“感觉能用”,而是要验证。你按这个顺序来:

  1. 先检查语法:nginx -t
  2. 重载配置:systemctl reload nginx
  3. 看监听:ss -lntp | grep nginx
  4. 压测入口:ab -n 1000 -c 50 http://example.com/ 或 wrk -t4 -c100 -d30s http://example.com/
  5. 看后端日志是否轮流命中两台机器

如果你发现请求总是落到一台机器,先看是不是浏览器缓存、前面还有 CDN、或者 upstream 里写了固定会话策略。再看 access_log 里有没有真实 IP。要是报 502 Bad Gateway,优先查后端进程是否活着、端口是否通、SELinux/防火墙有没有拦截。

我建议你做一个非常直观的“前后对比”:改配置前,单机接口在并发上来后 P95 延迟可能飙到 120ms 以上;改配置后,两台后端分摊流量,P95 往往能压到 60ms 左右。这个数字不是神话,关键看你的应用本身是不是 CPU 密集型或数据库瓶颈型。

最后:怎么确认真的修好了

验证是否成功,别只看页面能打开。你至少要确认三件事:第一,nginx -t 无报错;第二,访问日志里 X-Forwarded-For 和真实 IP 正常;第三,压测时两台后端都在稳定接收请求,并且没有持续 502/504。你也可以用 curl 连续请求 20 次,观察响应头和后端日志是否符合预期。只要这三项过关,说明你的 Nginx 反向代理和负载均衡已经真正跑稳了。

如果你想继续往下做,我下一期可以直接演示 HTTPS 证书、WebSocket 透传、以及更细的健康检查排障;如果你想省时间,也可以把这套思路先落地,再去对照官方文档或其他成熟方案。需要时,像 roxi.cc 这种入口也可以作为一个补充选项,但核心还是把上面的配置和验证步骤自己跑通。评论区告诉我,你现在卡在反代、负载均衡,还是 502 排错,我下一条视频直接按你的问题继续拆。