优雅下线需Nginx摘流、保障存量请求完成、后端主动配合、验证闭环四步协同:Nginx设weight=0或健康检查剔除节点;延长proxy_read_timeout并启用keepalive;后端收到SIGTERM后停新请求但保持旧连接;最后实测验证状态与连接归零。

要让后端服务器在 Nginx 负载均衡下真正“优雅下线”,核心不是等它挂了再补救,而是提前控制流量走向、留足处理时间、并由后端主动配合收尾。整个流程是三方协同:Nginx 配置、健康探测机制、后端退出行为,缺一不可。
一、Nginx 主动摘流:让新请求绕开待下线节点
不能依赖请求打过去失败才切换,必须在后端停机前就停止派发新流量:
- 将目标节点的 weight 设为 0,例如
server 10.0.1.10:8080 weight=0;,Nginx 立即停止向其转发新请求(已有长连接仍保持) - 启用 主动健康检查(需编译 nginx-upstream-check-module 或使用 OpenResty),配置如:
check interval=3 rise=2 fall=3 timeout=1 type=http;
并让后端 /health/ready 接口在下线前返回 503,Nginx 探测到即自动剔除 - 搭配 max_fails=1 fail_timeout=10s,确保一次失败就标记节点为 down,10 秒内不重试
- 通过
nginx -s reload或 Lua 模块热更新 upstream,避免全量重启中断连接
二、保障存量请求完成:draining 时间窗配置
已建立的连接不能被强制中断,Nginx 必须给后端留出自然处理完请求的时间:
- 设置 proxy_read_timeout 为业务最长响应时间(建议 ≥60s),确保后端有足够时间完成已接收请求
- 启用 HTTP/1.1 长连接:
proxy_http_version 1.1;proxy_set_header Connection "keep-alive"; - 在 upstream 块中添加 keepalive 32,复用连接,减少后端重建压力
- 开启 proxy_ignore_client_abort on,防止用户关闭页面导致 Nginx 中断后端仍在处理的请求
三、后端主动配合:控制退出节奏
Nginx 是协调者,安全关机的决定权在后端:
- 收到 SIGTERM 后,立即关闭新请求入口——停用 Tomcat connector、暂停 Netty EventLoop、或拒绝新 TCP 连接
- 保持已有连接可读写,不主动 close,等待活跃连接自然归零
- 通过 stub_status 或 nginx-module-vts 监控 Active connections,确认归零后再终止进程
- 若使用 systemd,配置
ExecStop和足够长的TimeoutStopSec(如 90s),避免被强制 kill
四、验证闭环:别只看配置,要实测
上线前必须跑通整条链路:
- 执行
nginx -T确认 weight 已置 0、check 指令已生效 - 访问
/status或监控面板,观察目标节点状态是否变为 down 或 unhealthy - 模拟并发请求,在下线过程中持续观测错误率、重试日志和响应延迟
- 确认 active connection 数从非零逐步降为 0,且无 502/504 报错
不复杂但容易忽略的是:Nginx reload 不会中断已建立的连接,但后端若未正确 draining,仍会导致请求丢失。关键在节奏对齐——Nginx 提前避让,后端稳住收尾。


















