Nginx中upstream必须定义在http块顶层,支持轮询、加权轮询、least_conn、ip_hash等策略,并可配置max_fails、fail_timeout等健康检查参数,配合proxy_pass实现负载均衡与容错。

在 Nginx 的 http 块中配置 upstream,是实现后端 HTTP 服务负载均衡最直接、最可靠的方式。它不依赖额外模块,原生支持多种调度策略,并能配合健康检查提升系统韧性。
必须放在 http 块顶层,不能嵌套在 server 或 location 中
upstream 指令有严格的位置要求:只能定义在 http { ... } 块内,且不能出现在 server 或 location 块中。Nginx 启动时会预先解析并初始化这个后端列表,供后续 proxy_pass 引用。
- 错误写法(启动报错):
server { upstream myapp { ... } } - 正确位置示例:
upstream my_backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
location / {
proxy_pass http://my_backend;
}
}
}
选择适合业务的负载均衡算法
默认采用轮询(round-robin),但可根据场景显式指定其他策略:
-
加权轮询:用
weight=调整节点处理比例,适用于后端性能不均,例如:server 192.168.1.10:8080 weight=3; -
最少连接:添加
least_conn;指令,优先转发给当前活跃连接数最少的后端,适合长连接或响应耗时差异大的服务 -
IP 会话保持:添加
ip_hash;,确保同一客户端 IP 始终路由到同一台后端,适合无共享 Session 的旧架构 -
URI 一致性哈希:使用
hash $request_uri consistent;(需 Nginx ≥ 1.7.2),适合缓存命中率敏感的场景
配置基础健康检查与容错能力
静态列表无法应对节点临时故障,建议为每个 server 补充健康探测参数:
-
max_fails=3:连续失败 3 次即标记该节点为不可用 -
fail_timeout=20s:进入不可用状态后,20 秒内不再转发请求;超时后自动恢复探测 -
backup:仅当所有非 backup 节点都不可用时才启用,常用于灾备节点 -
down:手动下线某节点,常用于维护窗口期
完整示例:server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=20s backup;
proxy_pass 引用与关键代理头设置
定义好 upstream 后,在 location 中通过 proxy_pass http://upstream_name 调用即可。注意两个细节:
- 若
proxy_pass末尾带斜杠(如http://my_backend/),Nginx 会截掉匹配的location路径再转发;不带斜杠则保留原始 URI - 务必设置以下代理头,否则后端将丢失真实客户端信息:
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;


















