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

在 Nginx 的 http 块中配置 upstream,是实现后端服务负载均衡最常用、最基础的方式。它不依赖外部模块,原生支持多种调度策略,且配置简洁清晰。
upstream 必须定义在 http 块内
upstream 指令不能出现在 server 或 location 块中,必须置于顶层 http 块下(通常在 /etc/nginx/nginx.conf 的 http { ... } 区域)。Nginx 启动时会预先解析并建立后端服务器列表,供后续 proxy_pass 引用。
- 错误示例:写在
server块里 → 启动报错"upstream" directive is not allowed here - 正确位置:
http { upstream my_backend { server 192.168.1.10:8080; server 192.168.1.11:8080; } server { location / { proxy_pass http://my_backend; } } }
支持的负载均衡算法与基本配置
Nginx 默认使用轮询(round-robin),无需显式声明。其他常用策略需在 upstream 块首行指定:
- 轮询(默认):请求依次分发,各 server 权重为 1
-
加权轮询:用
weight=2提升某节点处理比例,如server 192.168.1.10:8080 weight=3; -
最少连接:加
least_conn;指令,优先转发给当前活跃连接数最少的后端 -
IP Hash:加
ip_hash;,确保同一客户端 IP 总被路由到同一台后端(适合无共享 Session 场景) -
Hash 自定义键:如
hash $request_uri consistent;,按 URI 哈希并启用一致性哈希(需 nginx ≥ 1.7.2)
后端健康与容错配置
仅靠静态列表不够健壮,建议搭配健康检查相关参数提升可用性:
-
max_fails=3:连续失败 3 次则标记该 server 为不可用 -
fail_timeout=30s:30 秒内不向该 server 转发请求;30 秒后自动尝试恢复 -
backup:标记为备用节点,仅当其他所有节点都不可用时才启用 -
down:手动标记该 server 暂时下线(常用于维护) - 示例:
server 192.168.1.10:8080 weight=2 max_fails=3 fail_timeout=20s;
配合 proxy_pass 使用的关键细节
upstream 定义后,需在 location 中通过 proxy_pass http://upstream_name 引用。注意以下两点:
- 若
proxy_pass后带 URI(如proxy_pass http://my_backend/),Nginx 会截掉匹配的 location 路径再转发;不带斜杠(如proxy_pass http://my_backend)则完整保留原始 URI - 务必添加基础代理头,避免后端丢失真实客户端信息:
proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

















