Nginx集群平滑扩缩容的关键是热加载+后端协同+流量节奏控制:通过upstream动态增删节点并reload,新节点低权重渐进接入,旧节点draining下线;配合健康检查、长连接调优及去状态化设计,确保连接不断、请求不丢、会话不乱。

在 Nginx 集群中实现后端服务器的平滑扩容与收缩,关键不是“换机器”或“停服务”,而是让流量过渡自然、连接不中断、请求不丢失。它依赖 Nginx 的热加载能力、后端服务的协同配合,以及运维机制的节奏控制。
配置热加载:新增或下线节点零中断接入
所有变更都通过修改 upstream 块完成,无需重启 Nginx 进程:
- 扩容时,在 upstream 中追加新 server,例如:
server 192.168.1.103:8080 weight=1 max_fails=2 fail_timeout=5s; - 收缩时,直接删掉对应 server 行;若需保留但暂不承接流量,可加
down标记(如server 192.168.1.101:8080 down;) - 执行
nginx -t校验语法,再运行nginx -s reload—— master 启动新 worker,旧 worker 继续处理存量请求直至自然结束
流量节奏控制:避免冷启动冲击与连接堆积
单纯加 IP 不等于扩容成功,必须管理流量进入和退出的速率:
- 新节点初始设低权重(如
weight=1),老节点保持高权重(如weight=10),后续按需逐步调高 - 下线前向后端发送
SIGUSR2信号,使其进入 draining 模式:拒绝新连接,但维持已有长连接直到超时或主动关闭 - 对 WebSocket 或 HTTP/2 等长连接场景,同步调优:
proxy_read_timeout设为心跳周期 1.5 倍,启用proxy_http_version 1.1和proxy_set_header Connection ""
健康检查与自动摘除:保障流量只打到可用节点
人工维护易出错,必须靠机制自动识别异常并隔离:
- 被动检查:设置
max_fails=2 fail_timeout=10s,连续失败即暂停转发 - 主动检查(推荐):Nginx Plus 或 OpenResty + Lua 轮询
/health接口;Apache 可用mod_proxy_hcheck - 结合
proxy_next_upstream error timeout http_500,单次请求失败自动转给其他节点,提升容错性
状态解耦与统一管理:支撑无感扩缩容的前提
Nginx 不保存状态,后端必须去状态化,否则扩缩容会导致会话丢失或路由错乱:
- 用户登录态、房间归属、操作上下文等不能存在进程内存,必须写入 Redis 或共享数据库
- 前端请求携带 token,Nginx 用
proxy_set_header X-Auth-Token $arg_token透传,后端据此恢复会话 - 禁用
ip_hash做会话保持——扩容会引发哈希重分布;改用 cookie hash 或由后端统一调度


















