apache负载均衡下后端节点优雅下线的核心是status=-d标记节点进入draining模式,实现“只出不进”:停止派发新请求,但允许http/1.1 keep-alive、websocket等已有连接自然完成;需配合lbmethod=bybusyness/byrequests、proxytimeout与proxyset调优,并验证/balancer-manager状态为d及日志出现ah01170提示。

Apache 负载均衡下后端节点的优雅下线,核心是让节点“只出不进”:停止接收新请求,但允许已有连接(包括 HTTP/1.1 keep-alive、WebSocket、SSE、大文件上传等)自然完成,不强制中断。这不是简单停服务或删配置,而是一套协同动作。
用 status=-D 标记节点进入 draining 模式
这是最直接、无需重启 Apache 的运行时操作:
- 在
BalancerMember行中添加status=-D,例如:BalancerMember http://192.168.1.11:8080 route=node2 status=-D -
status=-D表示该节点进入 draining 状态,Apache 立即停止派发新请求,但已建立的连接仍可收发数据直至自然结束 - 状态变更即时生效,前提是启用了
mod_slotmem_shm(Apache 2.4 默认启用),无需 reload 配置 - 必须配合
ProxySet lbmethod=bybusyness或byrequests才能正确跳过该节点;bytraffic在 draining 下行为不可靠
保护长连接不被代理层意外断开
默认超时设置容易杀死 WebSocket 或空闲 keep-alive 连接,需显式调优:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 全局设长超时:
ProxyTimeout 600(10 分钟),避免握手后因 idle 被关闭 - 为 balancer 单独配置连接池:
ProxySet timeout=300 keepalive=on max=50 min=5 smax=20 ttl=300 - WebSocket 必须启用
mod_proxy_wstunnel,且后端地址使用ws://或wss://协议前缀,否则Upgrade头被过滤,连接无法建立
配合后端完成连接自然耗尽
Apache 不负责“催关”,只提供通道;后端需主动释放资源:
- 提供
/draining或/actuator/health端点,返回{"status":"DOWN"},并停止接受新请求 - Java 应用可调用
stopContext()或临时设maxThreads=0,让正在处理的请求跑完 - 临时关闭粘性会话:
ProxySet stickysession注释掉,防止用户被钉死在 draining 节点上
验证是否真正生效
改完配置不等于成功,必须确认实际行为:
- 访问
/balancer-manager页面(需提前授权),目标节点状态列应显示 D(不是 ND 或空) - 观察“Requests”计数是否停止增长;日志中出现
AH01170: Entering into draining mode提示 - 用
curl -I多次请求,检查Set-Cookie: ROUTEID=是否不再落到该节点的 route 上










