IBM HTTP Server(Apache2.4)下Sticky Session配置不生效排查
Apache 2.4内核IBM HTTP Server Sticky Session失效问题
问题现象
参考Cookie路由方案配置Sticky Session后,请求未按路由固定到后端节点,而是轮询分发到两台后端服务器,原始配置如下:
<VirtualHost *:443> ServerName localhost ProxyPreserveHost On SSLEnable SSLProxyEngine on ProxyRequests Off SSLTrace KeyFile "C:/Program Files/IBM/HTTPServer/key.kdb" SSLProxyCheckPeerCN off Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Max-Age=60 path=/TestApp" env=BALANCER_ROUTE_CHANGED <Proxy balancer://MyBalacer> BalancerMember "https://10.54.21.35:4001" route=dev_1 BalancerMember "https://10.54.21.35:4011" route=dev_2 ProxySet lbmethod=bytraffic ProxySet stickysession=ROUTEID </Proxy> <Location /TestApp> ProxyPass balancer://MyBalacer/TestAPI ProxyPassReverse balancer://MyBalacer/TestAPI ProxyPassReverseCookiePath /TestAPI /TestApp </Location> </VirtualHost>
经初步定位问题出在Cookie生成环节,修改前后的Cookie配置对比如下:
- 修改前:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Max-Age=60 path=/TestApp" env=BALANCER_ROUTE_CHANGED - 修改后:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; SameSite=None; path=/TestApp" env=BALANCER_ROUTE_CHANGED
根因分析
Sticky Session失效的核心原因是ROUTEID路由Cookie未被浏览器正常保存、携带,具体有两个触发点:
- Cookie属性语法错误:修改前的配置中,
Max-Age=60和path=/TestApp两个属性之间缺少分号(;)分隔,浏览器解析Set-Cookie头时会判定该属性段非法,直接丢弃整个ROUTEIDCookie。服务端收不到请求携带的路由标识,mod_proxy_balancer模块无法匹配之前分配的后端节点,只能按照bytraffic负载算法轮询分发请求。 - 跨域场景Cookie被浏览器拦截:当前服务为HTTPS协议,如果前端业务和
/TestApp接口存在跨域调用,Chrome 80+、Firefox 60+等现代浏览器默认会拦截未配置SameSite=None的第三方Cookie,即使Cookie生成合法,也不会在跨域请求中回传给服务端,同样会导致路由标识丢失。
修改后的配置移除了存在语法错误的Max-Age配置,补充了SameSite=None属性,同时解决了Cookie语法非法和跨域拦截问题,因此粘性会话恢复生效。
如果需要保留Cookie过期时间,修正属性分隔符、补充HTTPS场景必填的Secure属性即可,参考配置:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; Max-Age=60; SameSite=None; Secure; path=/TestApp" env=BALANCER_ROUTE_CHANGED
额外配置风险提示
现有配置存在一个潜在拼写错误:平衡器名称定义为MyBalacer(Balancer单词漏写字母n),如果后续其他路由规则引用时拼写为正确的MyBalancer,会直接触发平衡器不存在的报错,建议统一修正拼写。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

