nginx负载均衡通过nginx -s reload实现无中断节点增减,核心是新旧worker进程并存:新连接走新配置,旧连接由原进程处理完毕;需统一定义upstream、启用健康检查、reload前用nginx -t校验语法,并从进程、日志、流量三层面验证生效。

在 Nginx 负载均衡中,用 nginx -s reload 实现节点增减且不中断业务,关键不是“重启服务”,而是让新旧 worker 进程并存协作:新连接走新配置,旧连接继续由原进程处理完毕。整个过程对用户完全透明。
修改 upstream 配置添加或删除节点
所有后端节点必须统一定义在 upstream 块中,不能分散写在多个 location 或 server 块里:
- 新增节点:直接在
upstream app_backend { ... }中追加一行server 192.168.1.103:8080 max_fails=2 fail_timeout=5s; - 下线节点:删掉对应
server行即可(建议先设down标记做灰度观察) - 务必启用健康检查,例如
max_fails=2 fail_timeout=5s,让异常节点自动被剔除,避免人工误操作遗漏
执行 reload 前必须校验语法
nginx -s reload 会隐式调用语法检查,但失败时只报错、不回滚,容易导致服务静默失效:
- 先手动运行
nginx -t,确认输出 “syntax is ok” 和 “test is successful” - 若使用非默认配置路径,加
-c /etc/nginx/nginx.conf显式指定 - 常见错误包括端口冲突、include 文件路径不存在、括号不匹配等,日志里会标出具体行号
reload 后验证是否真正生效
命令返回成功 ≠ 配置已生效,需从三个层面交叉确认:
- 查进程:运行
ps aux | grep nginx,应看到 master 进程 + 新旧两批 worker 进程共存(旧进程启动时间早,新进程时间接近 reload 时间) - 看日志:
tail -f /var/log/nginx/error.log中出现reloading configuration表示信号已接收,无报错即流程正常 - 测流量:用
curl -sI http://your-domain/health多次请求,观察响应头中的X-Upstream-Addr(如自定义)或后端日志,确认新节点已收到请求
长连接与状态一致性注意事项
HTTP/1.1 keepalive、WebSocket、HTTP/2 流等长连接不会中断,但需额外调优才能保障体验:
- 设置
proxy_read_timeout 300;等参数,防止因超时过短导致长连接被意外关闭 - 确保后端应用支持 graceful shutdown,正在处理的请求不被强制终止
- 会话状态不能存在本地内存,必须外置到 Redis 或数据库,否则新节点无法继承用户上下文











