apache负载均衡下实现sticky session与优雅重连,核心是配置route+stickysession匹配后端标识(如jsessionid.node1),并启用健康检查(hcmethod=get/hcinterval=10)、failonstatus、retry及proxypreservehost等防护参数,确保用户无感知切换。

Apache 负载均衡下的连接保持(Sticky Session)与后端故障时的优雅重连,核心在于两件事:一是让同一用户始终落到同一台后端服务器,二是当某台后端不可用时,不中断用户请求、不暴露错误、自动切换并尽快恢复服务。这两者不是互斥的,而是需要协同配置。
会话保持:靠 route + stickysession 配合后端标识
Apache 本身不生成 session,它只识别和路由已有的会话标识。关键操作如下:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 后端应用必须在响应中设置含路由信息的 Cookie,常见为 JSESSIONID(Java 应用)或自定义如 ROUTEID
- 每个
BalancerMember必须声明route=xxx,例如:BalancerMember http://192.168.1.10:8080 route=node1 - 在
<proxy></proxy>块中启用粘性:ProxySet stickysession=JSESSIONID|ROUTEID(竖线表示“任一匹配即生效”) - 若 Cookie 中的 route 值无效或缺失,Apache 会按当前
lbmethod(如 byrequests) fallback 转发,不会报错
优雅重连:依赖健康检查 + 状态隔离 + 合理超时
所谓“优雅”,是指用户无感知地绕过故障节点,且连接不卡死、不堆积、不返回 503/502。实现要点:
- 启用主动健康检查(推荐 Apache 2.4.43+):
hcmethod=GET hcuri="/health" hcinterval=10 hcexpr="%{REQUEST_STATUS} == 200",失败立即标记为 down - 未启用 hcheck 时,靠被动检测:设置
failonstatus=500,502,503,504和timeout=5,连续失败后自动剔除,retry=60秒后重试 - 为热备节点加
status=+H,它不参与常规轮询,仅在其他节点全 down 时启用 - 避免长连接阻塞:在
ProxyPass中显式设timeout=30 keepalive=On max=100,防止后端僵死拖垮代理层
真实请求链路中的容错增强
仅靠模块默认行为还不够,需补充几个关键防护点:
-
ProxyPreserveHost On:确保后端能拿到原始 Host 头,对虚拟主机或多租户场景必不可少 -
ProxyBadHeader Ignore:忽略后端返回的非法响应头,避免整个响应被截断 - 配合
mod_slotmem_shm模块启用共享内存,保证多个 Apache worker 进程间会话路由状态一致 - 在
ProxyPassReverse后追加ProxyPassReverseCookieDomain和ProxyPassReverseCookiePath,修正 Set-Cookie 中的 domain/path,避免客户端 Cookie 写错域导致下一次请求无法命中 route









