直接修改upstream块中的调度指令即可平滑切换least_conn与其他算法,无需重启nginx,仅需nginx -s reload重载配置,新连接按新策略分发,已有连接不受影响。

直接修改 upstream 块中的调度指令即可实现 least_conn 与其他算法的平滑切换,无需重启 Nginx 进程——只要使用 nginx -s reload 重载配置,新连接就会按新策略分发,已有连接不受影响。
切换前确认基础条件
确保满足以下三点,才能保障切换过程稳定、无请求丢失或错配:
- Nginx 版本 ≥ 1.3.1(推荐 ≥ 1.18),可通过
nginx -v验证; - 所有后端服务健康可用,建议已配置
max_fails和fail_timeout等被动健康检查; - 避免在
upstream块中混用互斥指令(如least_conn和ip_hash同时存在会报错)。
常见切换场景与对应配置写法
不同算法切换只需替换 upstream 内的核心指令,其余 server 行保持不变:
-
切换到轮询(默认):删掉
least_conn;,或注释掉,保留纯server列表即可; -
切换到加权轮询:移除
least_conn;,为每个server添加weight=参数,例如server 192.168.1.10:8080 weight=3;; -
切换到 ip_hash:移除
least_conn;,添加ip_hash;指令(注意:ip_hash 不支持weight,也不兼容keepalive的连接复用逻辑); -
切换回 least_conn:确保
least_conn;是upstream块中唯一的调度指令,且未与其他哈希类指令共存。
切换时的关键注意事项
平滑不等于“零感知”,以下细节决定切换是否真正可靠:
- 重载后,Nginx 会立即用新策略处理新建连接,但已建立的长连接(如 WebSocket、HTTP/1.1 keepalive 流)仍维持原后端,自然终结,不会中断;
- 若从轮询切 least_conn,初期连接数统计可能短暂不准(因旧连接尚未释放),建议观察 1–2 分钟后再评估分布;
- least_conn 不支持权重,如需“加权最小连接”,不能靠配置实现,得借助 OpenResty 自定义 balancer_by_lua* 或升级至 NGINX Plus;
- 配合
keepalive N使用时,切换算法不影响已建连接池,但新连接池会按新策略初始化。
验证切换是否生效
不用等日志累积,可快速确认:
- 执行
nginx -t && nginx -s reload后,检查 error.log 是否有语法错误或冲突提示; - 用
curl http://localhost/stub_status(需启用ngx_http_stub_status_module)查看各 server 的Active connections实时值,对比 least_conn 切换前后连接数倾斜变化; - 模拟并发请求(如
ab -c 50 -n 500),检查后端 access.log 中各节点请求数分布是否符合预期策略特征。











