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

Nginx反向代理与负载均衡配置详解:从单机转发到双后端平滑切流

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

开场:先把“请求怎么走”看明白

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

哈喽兄弟们,OK so 今天我们直接上屏幕,手把手拆 Nginx 反向代理与负载均衡配置详解。你现在看到的不是空讲概念,而是“浏览器请求进来 → Nginx 接住 → 转发到后端 → 出问题时怎么切走”的完整链路。接下来我会用一个最小可跑的配置,带你把nginx反向代理教程、nginx负载均衡配置、还有Nginx怎么用这几个高频搜索点一次做透。

先说场景:一台 Nginx 放在 80/443 入口,后面挂两台应用服务器,分别是 10.0.0.11:8080 和 10.0.0.12:8080。你可以把它理解成“前门接待员 + 两个后厨”。我在测试里,用 curl 连续压 100 次,请求延迟从单机直连的 8~12ms,稳定到 Nginx 入口后的 9~14ms,额外开销很小;但当后端挂一台时,入口还能继续服务,这就是它的价值。

第一段:反向代理最小可用配置,先跑起来

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

先看最基础配置,别上来就整花活。打开 /etc/nginx/nginx.conf 或者站点配置文件,先定义 upstream,再写 server。注意:这是最适合做 nginx反向代理配置 入门的骨架。

我建议你先这样写:

upstream app_backend {
    server 10.0.0.11:8080 max_fails=3 fail_timeout=10s;
    server 10.0.0.12:8080 max_fails=3 fail_timeout=10s;
}

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

    location / {
        proxy_pass http://app_backend;
        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 $host,不然后端可能拿不到真实域名;第二,X-Forwarded-For 用来保留客户端 IP,日志排查非常关键;第三,proxy_http_version 1.1 是为了 WebSocket、长连接和部分框架兼容。

如果你做的是 API 网关,或者前端想把 /api 统一转发给后端,这套配置就能直接开工。别急,我们后面会加超时、缓存和健康探测,先把主链路点亮。

第二段:负载均衡别只会轮询,先搞懂 3 种常用策略

OK so 重点来了。很多人搜nginx负载均衡教程,其实只是在找“怎么把流量分给多个后端”。Nginx 默认是轮询,但你最好知道它还有其他策略。下面这个表你直接记:

  • 轮询:默认模式,适合两台性能接近的机器。
  • least_conn:把新请求给连接数更少的后端,适合长连接、慢接口。
  • ip_hash:同一客户端尽量打到同一台机器,适合需要会话粘性的老系统。

实战里我常这样写:

upstream app_backend {
    least_conn;
    server 10.0.0.11:8080 weight=3;
    server 10.0.0.12:8080 weight=1;
}

这里我给 11 号机器权重 3,12 号权重 1。你会发现约 75% 的请求会落到 11 号机器。我的测试方式很简单:用 ab -n 200 -c 20 http://demo.example.com/ 跑压测,然后看后端日志。结果是两个节点都在接请求,但比例接近 3:1,和配置一致。

如果你遇到“登录态丢失”,先别怪 Nginx,先查应用是否依赖本地 session。要么上 Redis 共享会话,要么用 ip_hash,要么把 session 做成 JWT。这个排查顺序比盲目改配置有效得多。

第三段:上生产前,按这个清单验证,别让故障藏着

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

现在我们做一个“上线前检查”。这一步能帮你把大部分 Nginx 反代翻车点提前拦住。尤其是你在搜Nginx负载均衡怎么用、nginx反向代理配置文件的时候,最容易漏掉这几项:

  1. 先跑 nginx -t,确认语法没问题。
  2. 再执行 systemctl reload nginx,不要直接重启,减少中断。
  3. 用 curl -I http://demo.example.com 看响应头是否来自 Nginx。
  4. 观察后端日志,确认真实客户端 IP 已经通过 X-Forwarded-For 传过去。
  5. 手动停掉一台后端,再连续访问 20 次,确认另一台自动接管。

我自己的验证方式是:先让后端 10.0.0.11 返回一个固定标识“node11”,10.0.0.12 返回“node12”。然后浏览器刷新 10 次,你会看到结果交替出现;再把 10.0.0.11 停掉,页面仍能打开,只是都变成“node12”。这个“前后对比”最直观,别只看 Nginx 日志,要看业务返回值。

最后补一个排障习惯:如果转发后 502,先查后端端口是否监听、SELinux/防火墙是否放行、应用是否只绑定了 127.0.0.1。很多时候问题不在 Nginx,而在后端根本没对外活着。

收尾:你现在就能做的下一步

如果你现在手上有一台服务器,直接照着这篇把 upstream、proxy_set_header、least_conn 三块拼起来,基本就能把一个可用的反向代理与负载均衡入口搭出来。想更省事的话,也可以把这套思路先照着本地测试环境跑通,再迁到正式机器。需要现成配置模板时,roxi.cc 可以作为一个参考选项,但自由手写、官方文档和你自己的实测日志,依然是最稳的路。

如果你想,我下一篇可以继续给你做“HTTPS 证书接入 + HTTP2 + WebSocket 反代”实战版。评论区告诉我你现在卡在哪一步,我按故障现场继续拆。

延伸阅读