Apache优雅摘除节点需协同使用mod_proxy_balancer的status=-D标记实现“只出不进”,配合ProxySet调优超时与连接池,并启用mod_proxy_wstunnel支持WebSocket,同时后端需提供/draining端点协同完成连接自然耗尽。

在 Apache 架构中,优雅摘除集群节点(即下线前不中断已有连接、不引入新请求)并保护长连接(如 WebSocket、HTTP/1.1 keep-alive、SSE 等),关键在于协同使用 mod_proxy_balancer 的状态控制、连接池管理与协议感知能力。不是简单停掉后端服务或注释配置,而是通过运行时标记 + 连接自然耗尽 + 协议级透传来实现平滑过渡。
用 status 参数实现节点“只出不进”
Apache 通过 status 标志控制节点参与调度的行为,无需重启服务即可生效:
-
status=-D:标记为“禁用”(disabled),不再接收新请求,但已建立的连接仍可完成响应 -
status=+H:启用健康检查(heartbeat),配合hcmethod可主动探测;若仅需摘除,-D更直接可靠 - 修改后立即生效,无需 reload 配置(前提是已启用
mod_slotmem_shm共享内存)
示例(将 node2 设为只出不进):
BalancerMember http://192.168.1.10:8080 route=node1
BalancerMember http://192.168.1.11:8080 route=node2 status=-D
ProxySet lbmethod=bybusyness
保护长连接不被代理层意外中断
Apache 默认可能在空闲超时或响应完成时关闭后端连接,这对长连接是致命的。需显式调大并隔离超时参数:
-
ProxyTimeout 600:全局代理超时设为 10 分钟,避免 WebSocket 握手后因 idle 被断开 -
ProxySet timeout=300 keepalive=on max=50 min=5 smax=20 ttl=300:为该 balancer 组单独设置连接池,启用复用、限制最大连接数、设定空闲存活时间 - 对 WebSocket 流量,必须加载
mod_proxy_wstunnel,并用ws://协议前缀,否则 upgrade 头被过滤,连接无法建立
配合后端完成连接自然耗尽
优雅摘除不是 Apache 单方面行为,需后端协同让活跃连接有序退出:
- Java 应用(如 Spring Boot)可提供
/actuator/health或自定义/drain端点,返回{"status":"DOWN"}并停止接受新请求 - Tomcat 可调用
stopContext()或设置maxThreads=0暂停新线程分配,让正在处理的请求跑完 - Avoid sticky session 强制绑定:若当前使用
stickysession=JSESSIONID,摘除前建议临时关闭(注释ProxySet stickysession),防止用户被钉死在即将下线的节点上
验证摘除是否真正生效
通过内置 /balancer-manager 页面观察实时状态:
- 目标节点的 “Status” 列应显示
D(Disabled),且 “Current Requests” 数值缓慢下降至 0 - “Elected” 列不再增长,说明无新请求进入该节点
- 访问日志中不应再出现该节点 IP 的
proxy:记录(如[proxy:debug]级别)
不复杂但容易忽略


















