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 头直接插入相应 Cookie
    • rewrite:使用服务端标识覆盖后端设置的 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=indirectsession_sticky_hide_cookie

2. rewrite 模式

  • Cookie 值由后端服务决定
  • 后端可控制哪些请求需要 session sticky
  • 若后端响应头未设置 Cookie,则认为不需要 session sticky

四、Cookie 格式解析

Cookie 值格式示例:

LBSID=d349ca31adc862f4d7e6faa19e516d6d|1556447041|1556447041

组成结构:

  1. LBSID:配置文件中 session_sticky 指定的键值
  2. 哈希值:后端计算出的唯一标识(如:d349ca31...)
  3. lastseen:最后一次使用时间戳(用于 maxidle 比较)
  4. 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 测试案例

  1. 首次请求选择后端:

    Set-Cookie: LBSID=10.0.23.20:80|1571297169|1571297169; Path=/
    
  2. 在 maxidle 时间内(30秒)请求:

    • 继续使用同一后端
    • 更新 lastseen 时间戳
  3. 超过 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
  • 敏感场景:设置适当的 maxidlemaxlife 增强安全性
  • 高可用:启用 fallback 确保后端故障时服务不中断

八、注意事项

  1. 确保后端服务器时间同步,避免时间戳问题
  2. 在 HTTPS 环境下设置 Cookie 的 Secure 标志
  3. 监控 Cookie 过期情况,合理设置 maxidle 和 maxlife
  4. 测试不同浏览器对 Cookie 的处理差异

通过合理配置 session_sticky_module,可以实现高效的会话保持,同时保持负载均衡的灵活性,是替代传统 ip_hash 方案的理想选择。

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 头直接插入相应 Cookie rewrite :使用服务端标识覆盖后端设置的 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 :配置文件中 session_ sticky 指定的键值 哈希值 :后端计算出的唯一标识(如:d349ca31...) lastseen :最后一次使用时间戳(用于 maxidle 比较) firstseen :第一次使用时间戳(用于 maxlife 比较) 五、工作流程示例 首次请求 响应头包含: 后续请求 响应更新 lastseen: 六、maxidle 测试案例 首次请求选择后端: 在 maxidle 时间内(30秒)请求: 继续使用同一后端 更新 lastseen 时间戳 超过 maxidle 时间后: 会话失效 重新选择后端 生成新的 firstseen 和 lastseen 七、配置建议 典型配置示例 参数选择建议 生产环境 :建议使用 mode=insert + option=indirect 敏感场景 :设置适当的 maxidle 和 maxlife 增强安全性 高可用 :启用 fallback 确保后端故障时服务不中断 八、注意事项 确保后端服务器时间同步,避免时间戳问题 在 HTTPS 环境下设置 Cookie 的 Secure 标志 监控 Cookie 过期情况,合理设置 maxidle 和 maxlife 测试不同浏览器对 Cookie 的处理差异 通过合理配置 session_ sticky_ module,可以实现高效的会话保持,同时保持负载均衡的灵活性,是替代传统 ip_ hash 方案的理想选择。