tengine session_sticky_module模块源码分析和使用
字数 1638 2025-08-15 21:33:42
Tengine session_sticky_module 模块详解与使用指南
一、模块概述
session_sticky_module 是 Tengine 的一个负载均衡模块,通过 Cookie 实现客户端与后端服务器的会话保持(Session Stickiness),确保同一客户端在一定条件下访问同一后端服务器。
与传统方案的对比
- ip_hash 缺点:仅基于客户端 IP 进行分配,同一 C 段 IP 固定指向同一后端,负载均衡效果不佳
- session_sticky 优势:基于 Cookie 实现更精确的会话保持,同时保持良好负载均衡能力
二、核心参数详解
基本参数
- cookie:设置用于会话保持的 Cookie 名称(如:LBSID)
- domain:设置 Cookie 的作用域名(可选)
- path:设置 Cookie 作用的 URL 路径(默认"/")
- maxage:设置 Cookie 生存期(默认 session cookie,浏览器关闭失效)
运行模式
- mode:
insert:通过 Set-Cookie 头直接插入相应 Cookierewrite:使用服务端标识覆盖后端设置的 Cookie
高级选项
- option:
indirect:Cookie 对后端透明(不传送给后端)direct:将 Cookie 传送给后端
- maxidle:设置会话 Cookie 的最大空闲超时时间(秒)
- maxlife:设置会话 Cookie 的最大生存期(秒)
- fallback:当 sticky 后端宕机时是否尝试其他机器
- hash:Cookie 中 server 标识使用明文或 MD5(默认 MD5)
三、运行模式详解
1. insert 模式
- Cookie 完全由负载均衡器管理
- 后端生成唯一 ID + maxidle + maxlife 作为 Cookie 值
- 需要配合
option=indirect和session_sticky_hide_cookie
2. rewrite 模式
- Cookie 值由后端服务决定
- 后端可控制哪些请求需要 session sticky
- 若后端响应头未设置 Cookie,则认为不需要 session sticky
四、Cookie 格式解析
Cookie 值格式示例:
LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041
组成结构:
- LBSID:配置文件中 session_sticky 指定的键值
- 哈希值:后端计算出的唯一标识(如:d349ca31...)
- lastseen:最后一次使用时间戳(用于 maxidle 比较)
- firstseen:第一次使用时间戳(用于 maxlife 比较)
五、工作流程示例
首次请求
curl -v 127.0.0.3:978
响应头包含:
Set-Cookie: LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041; Path=/
后续请求
curl --cookie "LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041; Path=/" 127.0.0.3:978
响应更新 lastseen:
Set-Cookie: LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447413|1556447041; Path=/
六、maxidle 测试案例
-
首次请求选择后端:
Set-Cookie: LBSID=10.0.23.20:80|1571297169|1571297169; Path=/ -
在 maxidle 时间内(30秒)请求:
- 继续使用同一后端
- 更新 lastseen 时间戳
-
超过 maxidle 时间后:
- 会话失效
- 重新选择后端
- 生成新的 firstseen 和 lastseen
七、配置建议
典型配置示例
upstream backend {
session_sticky cookie=LBSID mode=insert maxidle=1800 maxlife=3600;
server 10.0.1.1:8080;
server 10.0.1.2:8080;
}
参数选择建议
- 生产环境:建议使用
mode=insert+option=indirect - 敏感场景:设置适当的
maxidle和maxlife增强安全性 - 高可用:启用
fallback确保后端故障时服务不中断
八、注意事项
- 确保后端服务器时间同步,避免时间戳问题
- 在 HTTPS 环境下设置 Cookie 的 Secure 标志
- 监控 Cookie 过期情况,合理设置 maxidle 和 maxlife
- 测试不同浏览器对 Cookie 的处理差异
通过合理配置 session_sticky_module,可以实现高效的会话保持,同时保持负载均衡的灵活性,是替代传统 ip_hash 方案的理想选择。