Nginx基于权重的负载均衡通过upstream模块中server指令的weight参数实现,按权重比例分发请求,适用于后端服务器性能不均场景;需在http块内定义upstream,proxy_pass引用时必须使用http://+名称格式,并建议配合max_fails和fail_timeout提升容错能力。

Nginx 通过 upstream 模块实现基于权重的负载均衡,核心是为每个后端服务器显式设置 weight 值,让请求按比例分发。这种方式特别适合后端节点性能不一致(比如 CPU、内存、带宽差异大)的场景。
在 http 块中定义带权重的 upstream
必须把 `upstream` 块写在 `http{}` 内、所有 `server{}` 外。每个 `server` 行后面紧跟 `weight=` 参数:例如,三个 Tomcat 实例,其中本机处理能力更强,分配更多流量:
- 127.0.0.1:8080 weight=3 —— 接收约 50% 的请求(3 / (3+1+1))
- 192.168.1.24:8080 weight=1
- 192.168.1.25:8080 weight=1
完整配置示例:
upstream my_backend {
server 127.0.0.1:8080 weight=3;
server 192.168.1.24:8080 weight=1;
server 192.168.1.25:8080 weight=1;
}在 server 中用 proxy_pass 引用 upstream
在某个 `server{}` 块里,用 `location` 匹配请求路径,并通过 `proxy_pass` 指向上面定义的 upstream 名称(注意协议前缀是 `http://`,不是 `https://` 或 IP):最简转发配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://my_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}⚠️ 注意:proxy_pass 后面必须是 http:// 开头 + upstream 名,不能写成 http://127.0.0.1:8080 这类具体地址,否则权重失效。
配合健康检查提升稳定性
仅靠 weight 不足以应对后端临时故障。建议为每个 server 添加容错参数:- max_fails=2:连续失败 2 次,就标记该节点为不可用
- fail_timeout=30s:在这 30 秒内不向该节点转发请求
- backup:可选,作为备用节点,仅当其他全不可用时启用
增强版 upstream 示例:
upstream my_backend {
server 127.0.0.1:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.24:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.25:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.26:8080 backup; # 故障兜底
}验证与调试要点
配置完成后需重载生效:nginx -s reload 或 systemctl reload nginx。
- 查看 Nginx 错误日志(
error.log)确认 upstream 是否加载成功 - 用
curl -I http://your-domain/多次请求,结合后端 access 日志观察分发比例是否接近 weight 比例 - 手动停掉一个后端服务,确认请求自动避开它,且不出现超时或 502 错误
权重不是绝对数量控制,而是概率倾向;实际分发还受连接复用、keepalive、客户端并发节奏影响,但长期统计下会趋近设定比例。


















