nginx负载均衡需在http块内定义upstream并配合proxy_pass转发,支持加权轮询、least_conn、ip_hash等策略及健康检查(max_fails/fail_timeout),必须透传host、x-real-ip、x-forwarded-proto等关键header。

直接在 Nginx 的 http 块内定义 upstream,再配合 proxy_pass 转发和关键代理头设置,就能快速搭起稳定、可伸缩的负载均衡集群。它不依赖额外组件,原生支持流量分发、节点健康探测与自动故障隔离。
upstream 必须放在 http 块里,且名称全局唯一
upstream 不是独立指令,而是 HTTP 模块的上下文块,不能写在 server 或 location 里,否则启动报错。常见错误写法如:
server { location / { upstream demo {} } } —— 语法非法
正确做法是把所有 upstream 集中写在 nginx.conf 的 http { } 开头或末尾,例如:
- 放在
include mime.types;之后、include /www/server/panel/vhost/nginx/*.conf;之前(尤其宝塔用户需注意) - 名称用小写+下划线,语义清晰,如
api_backend、cms_cluster - 后续通过
proxy_pass http://api_backend;引用,名称大小写、拼写必须完全一致
按业务选对负载策略,别只靠默认轮询
轮询适合均质服务器,但真实场景中性能、延迟、连接类型差异大,应主动适配:
-
加权轮询(weight):给高配机器设更高权重,如
server 10.0.1.5:8080 weight=4承担约 4 倍流量 - 最少连接(least_conn):适合 WebSocket、gRPC 等长连接场景,新请求优先落到活跃连接最少的后端
- IP 哈希(ip_hash):保障同一客户端 IP 始终路由到固定后端,适用于无共享 Session 的传统应用;启用后不可再设 weight
- 策略指令(如
least_conn;或ip_hash;)必须写在 upstream 块首行,server 行之前
每个 server 都要配健康检查参数,不能只列 IP
仅定义地址无法应对宕机或响应缓慢,必须让 Nginx 主动识别并规避异常节点:
-
max_fails=3 fail_timeout=30s:30 秒内连续失败 3 次,该节点被标记为不可用,30 秒后自动重试 -
backup:仅当所有非 backup 节点都不可用时才启用,适合灾备或低优先级实例 -
down:手动置为不可用,常用于计划内维护,重载配置后立即生效 - fail_timeout 不宜过短(如低于 20s),否则可能误判短暂抖动为故障
proxy_pass 调用 + 关键 header 透传才算完整链路
upstream 定义只是“声明”,真正生效靠 proxy_pass 和 header 设置:
- location 中写
proxy_pass http://my_cluster;—— 注意结尾无斜杠,除非后端路径逻辑要求透传 - 必须设置
proxy_set_header Host $host;,否则后端收不到原始 Host 值,影响虚拟主机识别或 HTTPS 跳转 - 补充
X-Real-IP和X-Forwarded-For,确保后端能拿到真实用户 IP - HTTPS 场景务必加
proxy_set_header X-Forwarded-Proto $scheme;,避免后端误判协议导致跳转异常











