nginx通过upstream中server指令的weight参数实现加权轮询,按相对权重比例(如4:2:1)自动分配流量,需置于http块内、配合max_fails和fail_timeout健康检查,并确保proxy_pass引用http://upstream_name格式。

直接在 upstream 块里给每个 server 行加上 weight 参数,Nginx 就会按比例分发请求。这是最常用、最稳妥的加权轮询方式,不需要额外开启模块或写复杂逻辑。
权重怎么配才合理
权重不是绝对数值,而是相对比例。比如三台机器性能比约为 4:2:1,就分别设 weight=4、weight=2、weight=1。Nginx 会自动算出长期请求占比(例如 4+2+1=7,对应约 57%、29%、14%)。
- 新上线的高配节点可设更高 weight,老旧或测试机适当调低
- 避免用过大数字(如 weight=100),容易放大配置误差;建议控制在 1–10 范围内
- 所有节点未写 weight 时,默认为 1,等效于纯轮询
基础配置写法
把 upstream 定义放在 http 块里,proxy_pass 指向它即可:
upstream app_cluster {
server 192.168.1.10:3000 weight=4;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 weight=1;
}
server {
location / {
proxy_pass http://app_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
注意:proxy_pass 后必须带 http:// 前缀和 upstream 名称,不能加路径(如 /api),否则权重可能失效。
配合健康检查更稳
光靠权重还不够,真实环境中节点可能临时卡顿或宕机。建议每行 server 后加上被动健康检查参数:
-
max_fails=3:连续失败 3 次就标记为不可用 -
fail_timeout=30s:30 秒内不往这台机器发请求 - 组合写法:
server 192.168.1.10:3000 weight=4 max_fails=3 fail_timeout=30s;
这样即使某台高权重点暂时异常,Nginx 也会自动跳过,等恢复后再重新纳入调度。
权重之外的补充策略
如果后端有长连接或响应时间差异大(比如文件上传、报表导出),单纯加权轮询可能导致瞬时堆积。这时可以叠加 least_conn:
upstream app_cluster {
least_conn;
server 192.168.1.10:3000 weight=4;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 weight=1;
}
least_conn 会让 Nginx 优先选当前活跃连接数最少的节点,再结合权重做二次分配,更适合耗时型业务。











