加权轮询需在http块中定义upstream并设weight,location中用proxy_pass http://upstream_name/引用;权重按比例分配,如3:1:2对应50%、16.7%、33.3%;必须校验语法后reload生效。

加权轮询分发的关键不在 location 块里写逻辑,而是在 http 块中定义 upstream,再由 location 中的 proxy_pass 引用它。
在 http 块中定义 upstream 并设置 weight
所有权重策略必须写在 upstream 块内,位置通常为 /etc/nginx/nginx.conf 的 http { } 区域。每台后端服务器用 server 指令声明,并通过 weight=数字 指定相对处理能力:
- 不写
weight就是默认轮询(各占约 1/3、1/3、1/3) - 写了
weight就按比例分配:比如weight=3、weight=1、weight=2,总和为 6,则三台分别承担约 50%、16.7%、33.3% 的请求 - 支持 IP:端口、域名、Unix socket;还可叠加
max_fails=2 fail_timeout=30s提升容错性
示例配置:
upstream app_cluster {
server 192.168.1.10:3000 weight=3;
server 192.168.1.11:3000 weight=1;
server 192.168.1.12:3000 weight=2 max_fails=2 fail_timeout=30s;
}
在 server 的 location 中正确引用 upstream
location 块本身不参与负载决策,只负责转发。关键点是 proxy_pass 的写法:
- 必须带完整协议:
http://app_cluster或https://app_cluster - 末尾斜杠影响路径重写:
proxy_pass http://app_cluster/;会剥离匹配前缀(如/api/),再拼接到后端;不加斜杠则原样转发,容易导致 404 - 建议始终加上斜杠,尤其当后端服务期望根路径时
示例:
server {
listen 80;
server_name api.example.com;
location /api/ {
proxy_pass http://app_cluster/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
验证与生效
配置完成后不能直接 reload,必须先校验语法是否正确:
- 运行
sudo nginx -t,提示success才表示无误 - 执行
sudo systemctl reload nginx热更新配置,不中断服务 - 观察 Nginx 访问日志或用
ab、wrk工具压测,确认请求按权重比例落到对应后端
常见误区提醒
这些写法会导致配置失败或行为异常:
- 在
upstream块里写round_robin、default等关键字——Nginx 不识别,nginx -t直接报错 - 把
weight写在location或server块里——无效,权重只在upstream中起作用 -
proxy_pass缺少协议头(如写成proxy_pass app_cluster;)——Nginx 会当成本地文件路径处理,返回 502











