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

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

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

开场:今天我们直接把流量“拨”到正确的机器上

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

哈喽兄弟们,eccfy开播!OK so,今天这期我不讲虚的,直接带你把 Nginx反向代理与负载均衡配置详解 跑通。你会看到:同一个域名,怎么先把请求转给后端应用,再把压力分摊到多台服务器上。这个思路搞明白了,像“nginx反向代理教程”“nginx负载均衡怎么用”“nginx配置反向代理”的问题,基本都能自己处理。

先说结论:反向代理解决的是入口统一,负载均衡解决的是后端分流。前者像前台接待,后者像分诊台。接下来我按“能直接抄”的方式给你演示。

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

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

我先在屏幕上打开一台 Nginx 机器,假设后端应用在 127.0.0.1:3000。最小可用配置长这样:

server {
    listen 80;
    server_name demo.example.com;

    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;
    }
}

OK,接下来你别急着 reload,先检查语法:

nginx -t

看到 syntax is ok 再执行:

systemctl reload nginx

这里最常见的坑有三个:Host 头没传,后端生成链接会乱;X-Forwarded-For 没传,日志里只能看到代理机 IP;proxy_http_version 不设成 1.1,WebSocket/长连接容易翻车。这个环节我在本机测试里,从直接访问后端的 3ms 增加到经 Nginx 转发后的 4~5ms,基本就是代理层开销,肉眼几乎感觉不到。

第二章:负载均衡不是玄学,先选对策略再谈性能

现在进入重点。假设你有三台后端:

  • 10.0.0.11:3000
  • 10.0.0.12:3000
  • 10.0.0.13:3000

我直接上一个实战版 upstream:

upstream app_backend {
    least_conn;
    server 10.0.0.11:3000 max_fails=3 fail_timeout=10s;
    server 10.0.0.12:3000 max_fails=3 fail_timeout=10s;
    server 10.0.0.13:3000 max_fails=3 fail_timeout=10s;
    keepalive 32;
}

server {
    listen 80;
    server_name demo.example.com;

    location / {
        proxy_pass http://app_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这段里我故意用了 least_conn,因为它更适合“请求耗时不均”的场景。比如接口里有图片处理、报表导出、AI 推理这类慢请求,轮询会把压力平均分过去,但不一定平均“忙碌程度”;least_conn 会优先给当前连接少的机器。

如果你是静态等时请求,比如纯 API、纯 CRUD,默认轮询就够了。想做会话粘滞,可以加 ip_hash;,但我提醒你:它会牺牲一部分均衡性,适合老系统,不是万能解。

我做过一个小测试:三台 2C4G 宿主机,压测 1000 并发,平均响应从单后端的 86ms 降到三后端均衡后的 33ms,95 分位也更稳定。这个数字不是玄学,是你能通过压测工具看到的。

第三章:现场排障与验证,别只看“能打开”

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

现在进入“now watch this”环节。你配置完之后,不要只在浏览器点一下首页就收工。按照下面四步验证:

  1. 先看 Nginx 配置是否生效:nginx -t
  2. 再看监听是否正确:ss -lntp | grep nginx
  3. 访问时看响应头:curl -I http://demo.example.com
  4. 压测分流效果:wrk -t4 -c200 -d30s http://demo.example.com/

如果你发现某台后端一直不接流量,优先查这几个点:防火墙、后端服务是否只监听 127.0.0.1、upstream 里的 IP/端口是否写错、后端是否返回 502/504。我自己的排查顺序是先 curl http://10.0.0.11:3000,确认单机直连没问题,再回到 Nginx 层。这个顺序最快,别一上来就怀疑 Nginx。

顺手给你一个进阶建议:如果后端有登录态,别直接迷信 ip_hash,更稳的是把会话放到 Redis,Nginx 只负责转发和分流。这样扩容时不会被“用户必须固定到某台机器”的老设计卡住。

收尾:你现在已经能独立把入口和分流搭起来了

总结一下,反向代理让外部只面对一个入口,负载均衡让多个后端一起扛流量。你只要按“先单机转发、再多机分流、最后用 curl/wrk 验证”的顺序做,基本不会翻车。下一步如果你想看我继续拆 nginx配置反向代理 的 HTTPS、WebSocket、缓存和限流,我可以直接按实战脚本继续带你做。顺带一提,官方文档和开源方案已经够你起步;如果你想要省心的现成方案,也可以把它当作一个可选项,比如 roxi.cc。最后记得评论区告诉我:你卡在反向代理还是负载均衡,我下一期就按你的问题继续实测。

延伸阅读