nginx通过upstream块定义后端服务器组,配合proxy_pass实现负载均衡;需根据服务状态、节点性能和连接类型选择轮询、加权轮询、least_conn或ip_hash策略,并配置健康检查与请求透传。

直接在 Nginx 中配置 upstream 块并搭配 proxy_pass,就能实现后端多节点的请求分发。关键不是加几台机器,而是根据服务是否有状态、节点性能是否一致、连接类型是否长时,选对策略并配好健康机制。
定义 upstream 服务器组
所有后端节点必须统一在 http 块中声明,用一个逻辑名称(如 app_backend)代表整个集群:
- 每行
server指令写一个后端地址,支持 IP 或域名 + 端口,例如server 10.0.1.5:8000; - 若节点性能不均,加
weight=参数,比如server 10.0.1.5:8000 weight=3;表示承担约 3 倍于默认权重(1)的流量 - 为容灾考虑,可标记备用节点:
server 10.0.1.6:8000 backup;,仅当其他节点全不可用时才启用 - 手动下线某节点,直接加
down:例如server 10.0.1.7:8000 down;,无需重启即可生效
按业务选分发策略
策略写在 upstream 块开头,决定请求怎么落到具体节点:
- 轮询(默认):不加任何指令,适合无状态、节点性能接近的服务,Nginx 自动跳过故障节点
-
加权轮询:配合
weight=使用,适合新老机器混用或容器规格不一的场景 -
least_conn:在
upstream首行写least_conn;,适合 WebSocket、文件上传等长连接,或后端处理耗时不均的情况 -
ip_hash:写
ip_hash;,同一客户端 IP 总打到同一后端,解决没做 Session 共享时的登录态问题;注意 NAT 环境下可能造成倾斜
配置 proxy_pass 转发与请求透传
在 server 或 location 块中把流量真正导过去,并确保后端能拿到真实信息:
-
proxy_pass http://app_backend;—— 名称必须和 upstream 定义一致,末尾不加斜杠 - 必须设置
proxy_set_header Host $host;,否则后端可能无法识别原始域名 - 加上
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For,让后端拿到真实客户端 IP - 若后端依赖 HTTPS 上下文,补上
proxy_set_header X-Forwarded-Proto $scheme;
启用健康检查与故障隔离
Nginx 开源版靠被动检测保障可用性,靠参数组合自动剔除异常节点:
-
max_fails=3:某节点连续 3 次转发失败(如超时、5xx),就标记为不可用 -
fail_timeout=30s:被标记后,30 秒内不再转发请求;30 秒后尝试恢复,成功则重新加入 - 这两个参数写在
server行末,例如:server 10.0.1.5:8000 weight=3 max_fails=3 fail_timeout=30s; - 搭配
backup或down,可实现维护期间零感知切换











