Nginx upstream必须定义在http块内,支持轮询、加权轮询、ip_hash、least_conn等负载策略,并需配置max_fails/fail_timeout等健康检查参数,proxy_pass须以http://upstream_name;格式引用。

直接在 Nginx 的 http 块内定义 upstream,是实现后端集群负载均衡最标准、最可靠的方式。它不依赖外部模块,纯配置即可完成请求分发、故障自动规避和基础健康检查。
upstream 必须放在 http 块里
这是硬性要求:upstream 不能嵌套在 server 或 location 中,否则 Nginx 启动会报错 “upstream directive is not allowed here”。正确位置是主配置文件(如 /etc/nginx/nginx.conf)的 http { } 区域内,建议加在所有 include 语句之前,避免被覆盖或忽略:
- ✅ 正确示例:
http {
upstream my_api {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
include /etc/nginx/conf.d/*.conf;
} - ❌ 错误写法:把 upstream 放进站点配置文件(如宝塔的 vhost 文件)或 server 块里——这类文件只支持单目标反向代理,无法生效
选择适合业务的负载策略
不同场景对应不同调度逻辑,不能只写 server 就完事:
- 轮询(默认):请求依次分发,适合节点性能接近、无状态服务
- 加权轮询(weight):按性能差异分配流量,例如 server 192.168.1.10:8080 weight=4; 和 server 192.168.1.11:8080 weight=1; 构成 4:1 流量比
- ip_hash:同一客户端 IP 固定打到同一台后端,适用于依赖本地 session 的老系统;注意它与 weight 冲突,不可共存
- least_conn:新请求优先发给当前活跃连接最少的节点,适合长连接网关、WebSocket 等连接密集型服务
必须配健康检查参数才真正可用
只列 IP 地址只是静态列表,没有容错能力。要让 Nginx 主动识别并绕过故障节点,每个 server 都应加上探测参数:
- max_fails=3 fail_timeout=30s:30 秒内连续失败 3 次,该节点被临时剔除,30 秒后自动重试
- backup:标记为灾备节点,仅当所有非 backup 节点都不可用时才启用
- down:手动下线,常用于计划内维护,配置保留但不参与调度
- ⚠️ 注意:单节点 upstream 会忽略 max_fails/fail_timeout,健康检查实际失效,至少两个 server 才有意义
proxy_pass 引用要严格匹配
upstream 定义完,必须在 location 中通过 proxy_pass 正确调用,否则整个配置无效:
- ✅ 正确写法:proxy_pass http://my_api;(注意 http:// 前缀 + 名称 + 分号 + 结尾无斜杠)
- ❌ 错误写法:proxy_pass http://192.168.1.10:8080; 或 proxy_pass my_api; —— 权重、健康检查、算法全部失效
- 务必设置关键头信息:
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;











