nginx负载均衡需支持动态扩容,应启用健康检查、加权轮询及服务发现。配置须可扩展、自动感知故障、免手动改ip,通过热重载保障零中断。

配置 Nginx 负载均衡以支持后端集群快速扩容,关键不是“一次性写死”,而是让配置具备可扩展性、自动感知能力与低干预运维特性。重点在于减少每次加机器时的手动改配置、重载服务等操作,同时保障请求分发合理、故障节点及时剔除。
一、用 upstream + 动态健康检查打基础
静态列服务器 IP 的方式在频繁扩容时极易出错。必须启用内置健康检查机制,让 Nginx 主动探测后端可用性:
- 在
upstream中为每个server设置max_fails=3 fail_timeout=20s,Nginx 会在连续失败 3 次后暂停转发 20 秒 - 配合
proxy_next_upstream error timeout http_500 http_502 http_503,让上游返回异常时自动重试其他节点 - 避免使用
ip_hash或hash $request_uri等强绑定策略——它们会阻碍新节点立即承接流量,除非业务明确需要会话保持
二、优先采用加权轮询 + 合理权重分配
新扩容的机器性能可能与老机器不同,直接轮询会导致负载不均。通过 weight 参数按实际能力分配流量:
- 例如:老节点设
weight=5,新上线的高配节点设weight=10,让其多承接一倍请求 - 权重值无需严格对应 CPU/内存数值,但应反映相对处理能力,建议用压测 QPS 作为参考基准
- 扩容后只需新增一行
server ip:port weight=N;,无需调整已有节点权重
三、对接服务发现(进阶:免手动维护 IP 列表)
当后端实例达到几十上百台,或使用容器/K8s 时,硬编码 IP 不可持续。推荐两种轻量级落地方式:
-
Consul + nginx-upstream-check-module:Consul 自动注册/注销服务,Nginx 通过 Lua 或第三方模块定时拉取健康节点列表并热更新
upstream - OpenResty + etcd:用 Lua 脚本监听 etcd 中的服务地址变更,动态构建 upstream,完全绕过 reload
- 若暂不引入外部组件,至少把
upstream单独抽成/etc/nginx/conf.d/upstream.conf,扩容时只改这个文件,降低主配置污染风险
四、配置生效要快,且不中断流量
每次扩容后需验证并上线,务必用安全方式重载:
- 先执行
nginx -t校验语法,避免配置错误导致整个入口宕机 - 用
nginx -s reload或systemctl reload nginx实现热重载,连接不中断 - 禁用
kill -HUP等原始信号操作;生产环境建议配合 Ansible 或 Shell 脚本做一键校验+重载+日志确认











