apache 通过 status=-d 进入 draining 模式实现后端服务优雅下线:立即停止分发新请求,但保持已有长连接直至自然结束;需配合 proxyset、超时调优、websocket 支持及后端主动配合,并通过 /balancer-manager 等方式验证状态生效。

Apache 代理本身不直接“关机”后端服务,而是通过流量调度控制,让后端服务在无新请求、旧连接自然结束的前提下安全退出。关键不是 Apache 停掉后端,而是 Apache 主动停止派发新请求,同时保护已有连接不被中断,为后端争取完整的 graceful shutdown 时间窗口。
用 status=-D 进入 draining 模式
这是最核心、无需重启 Apache 的运行时操作。修改 BalancerMember 行,添加 status=-D:
-
status=-D表示该节点进入“排水”状态:Apache 立即停止向其分发新请求,但已建立的 HTTP/1.1 keep-alive、WebSocket、SSE、大文件上传等长连接仍可收发数据直至自然完成 - 状态变更即时生效(依赖
mod_slotmem_shm,Apache 2.4 默认启用),无需 reload - 必须搭配
ProxySet lbmethod=bybusyness或byrequests;bytraffic在 draining 下行为不可靠
调优连接与超时参数
默认超时会误杀长连接,需显式延长并精细化配置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 全局设长空闲超时:
ProxyTimeout 600(10 分钟),避免 WebSocket 握手后因 idle 被关闭 - 为负载均衡器单独配置连接池:
ProxySet timeout=300 keepalive=on max=50 min=5 smax=20 ttl=300 - 若后端使用 WebSocket,必须启用
mod_proxy_wstunnel,且后端地址写成ws://或wss://协议前缀,否则Upgrade头被过滤,连接无法建立
后端配合完成自然耗尽
Apache 不主动“催关”,只提供通道;后端需响应 draining 状态并释放资源:
- 暴露
/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=是否不再落到该节点










