haproxy 基于 cookie 的会话保持

haproxy cookie session persist

feat

  1. 请求会转发给配置了相同cookie的server
  2. 会转发给weight=0的后端
  3. 默认不会转发给down状态或disabled的server
    1. 如果设置了option persist或者force-persist,则会强制转发给down状态或者disabled的server;同时如果配置了option redispatch,则尝试请求down状态的server失败后,仍然会将请求转发给其他up状态server
  4. 如果配置了ignore-persist if|unless $acl_condition,则满足acl规则的请求,会发送给所有的后端,而不是匹配cookie的后端

示例

# 客户端请求将被转发给具有相同cookie值的后端
backend be1
    # 设置响应的Set-Cookie头部
    # 参看cookie policy 
    cookie $cookie_name $cookie_ops_policy $other_params

    server serv1 cookie $cookie_value
  1. 设置的cookie和server返回的cookie不重名

    1. rewrite 啥也不干
    2. insert 在响应中增加设置的cookie
    3. prefix 啥也不干
  2. 设置的cookie和server返回的cookie重名

    1. rewrite
      设置该cookie的值为server配置中设置的$cookie_value
    2. insert

      默认移除server返回的cookie,然后增加该cookie;如果设置了preserve,则不会修改server返回的cookie;如果设置了indirect,请求转发给后端时,会删除该cookie
    3. prefix

      在server返回的cookie的值前加上server配置中设置的$cookie_value~前缀,比如server返回A, server配置中设置了B,那么返回给客户端的cookie值为B~A

是否转发给down或者disabled的server

  1. force-persist if|unless $acl_condition
    1. 根据acl规则,将请求强制转发给down或者disabled的server
  2. option persist
    1. 强制尝试转发给down 或者disabled的server

取消某些请求的cookie persistence

  1. ignore-persit if|unless $acl_condition
    1. 根据acl规则,取消某些请求的cookie persistence特性,这些请求将按照转发策略,发给所有的后端
    2. 一般用于静态内容的请求,或者其他无需会话保持的请求
  1. 配置了option redispatch, 当会话保持选择的后端无法处理新的请求时(比如请求过多,后端down掉),会尝试分发请求到其他后端,从而让会话保持失效

客户端多次收到Set-Cookie头部

  1. haproxy 会每隔4s重新设置一次cookie,暂未找到可以配置的选项,此时客户端始终收到的是同一个cookie值
  2. 发生redispatch,此时客户端将收到不同的cookie值
posted @ 2021-01-07 16:07  哲淡  阅读(329)  评论(0编辑  收藏  举报