haproxy 基于 cookie 的会话保持
haproxy cookie session persist
feat
- 请求会转发给配置了相同cookie的server
- 会转发给weight=0的后端
- 默认不会转发给down状态或disabled的server
- 如果设置了option persist或者force-persist,则会强制转发给down状态或者disabled的server;同时如果配置了option redispatch,则尝试请求down状态的server失败后,仍然会将请求转发给其他up状态server
- 如果配置了
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
cookie policy
-
设置的cookie和server返回的cookie不重名
- rewrite 啥也不干
- insert 在响应中增加设置的cookie
- prefix 啥也不干
-
设置的cookie和server返回的cookie重名
- rewrite
设置该cookie的值为server配置中设置的$cookie_value - insert
默认移除server返回的cookie,然后增加该cookie;如果设置了preserve,则不会修改server返回的cookie;如果设置了indirect,请求转发给后端时,会删除该cookie - prefix
在server返回的cookie的值前加上server配置中设置的$cookie_value~前缀,比如server返回A, server配置中设置了B,那么返回给客户端的cookie值为B~A
- rewrite
是否转发给down或者disabled的server
force-persist if|unless $acl_condition
- 根据acl规则,将请求强制转发给down或者disabled的server
- option persist
- 强制尝试转发给down 或者disabled的server
取消某些请求的cookie persistence
ignore-persit if|unless $acl_condition
- 根据acl规则,取消某些请求的cookie persistence特性,这些请求将按照转发策略,发给所有的后端
- 一般用于静态内容的请求,或者其他无需会话保持的请求
cookie persistence失效的情况
- 配置了option redispatch, 当会话保持选择的后端无法处理新的请求时(比如请求过多,后端down掉),会尝试分发请求到其他后端,从而让会话保持失效
客户端多次收到Set-Cookie头部
- haproxy 会每隔4s重新设置一次cookie,暂未找到可以配置的选项,此时客户端始终收到的是同一个cookie值
- 发生redispatch,此时客户端将收到不同的cookie值
聚沙成塔 滴水石穿