nginx集群扩容时通过统一weight=1的加权轮询、nginx -s reload热重载及max_fails健康检查,可使新增节点立即、公平、无中断参与新请求分发,实现流量自然摊薄。

在集群扩容时让 Nginx 自动平分现有网络流量,关键不是“强制平均”,而是通过配置使新增节点**立即、公平、无中断地参与新请求分发**,同时不干扰已有连接。Nginx 本身不主动重调度已建立的连接,所以“平分”指的是对后续所有新建请求的负载分配趋于均衡——这依赖合理的策略选择与热加载机制。
用加权轮询实现流量自然摊薄
默认轮询(round robin)在节点数变化后会自动重新排布请求顺序,但若新旧节点性能差异大,容易造成实际负载不均。推荐显式使用 weight 并设为相同值,确保每台服务器获得等概率的新请求:
- 在
upstream块中为所有节点(含新增)统一设置weight=1,例如:upstream backend {<br> server 192.168.1.101:8080 weight=1;<br> server 192.168.1.102:8080 weight=1;<br> server 192.168.1.103:8080 weight=1; <!-- 新增 --><br>} - 避免混用不同权重;若必须差异化,按 CPU/内存比例设定,而非随意赋值
- weight 不影响已有长连接,只作用于新建立的请求
执行热重载,零中断接入新节点
添加配置后无需重启 Nginx 进程,用信号触发平滑升级即可让新节点立刻参与分流:
- 先校验:运行
nginx -t确保语法正确 - 再重载:执行
nginx -s reload - 旧 worker 继续服务存量连接,新 worker 启动并开始用更新后的 upstream 列表分发新请求
- 整个过程毫秒级完成,客户端无感知
配合健康检查,防止流量打到异常节点
即使配置了新节点,若其尚未就绪或短暂故障,Nginx 默认仍可能转发请求。需启用基础健康探测保障分流质量:
- 在
server行后添加max_fails=2 fail_timeout=5s,例如:server 192.168.1.103:8080 weight=1 max_fails=2 fail_timeout=5s; - 连续失败 2 次后,该节点将在 5 秒内被临时摘除,不参与新请求分发
- 若需更精细控制(如 HTTP 状态码探测),可编译安装
nginx_upstream_check_module
注意长连接场景下的实际分流效果
对于 HTTP/1.1 Keep-Alive 或 WebSocket,单个连接会复用多次请求,此时“新请求”不等于“新连接”。真正体现扩容效果需结合连接生命周期:
- 确保
proxy_http_version 1.1和proxy_set_header Connection ""已启用,避免连接过早关闭 - 适当调大
proxy_read_timeout(如设为 60–300 秒),避免因超时频繁重建连接导致旧节点持续承压 - 后端服务支持 graceful shutdown(如接收 SIGUSR2 进入 draining),让活跃连接自然退出,不强行中断











