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 模式
这是最直接、无需重启的运行时操作。修改 BalancerMember 行,添加 status=-D:
-
status=-D表示该节点进入“draining”(排水)状态:Apache 立即停止向其分发新请求,但已建立的连接仍可收发数据直至自然结束 - 无需 reload Apache,只要启用了
mod_slotmem_shm(默认启用),状态变更即时生效 - 必须配合
ProxySet lbmethod=bybusyness或byrequests才能正确跳过该节点;bytraffic在 draining 下行为不可靠 - 示例配置:
<proxy balancer:><br> BalancerMember http://192.168.1.10:8080 route=node1<br> BalancerMember http://192.168.1.11:8080 route=node2 status=-D<br> ProxySet lbmethod=bybusyness<br></proxy>
保护长连接不被代理层意外断开
默认超时设置会杀死 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 值上 - 待活跃连接归零(可通过后端监控或 Apache 日志判断),再执行
systemctl stop tomcat等停服务操作










