yorknong 发表于 2019-1-2 10:42:12

haproxy解决多主机session共享问题 的三种方法

  1.session知识储备
  Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。
  而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。
  服务器也通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
  php.ini 里几个session相关值的 其它的值请参考《PHP与Mysql5程序设计》
  session.use_cookies = 1#表示 服务端和客户端交互session是通过cookie的方式 默认值
  session.name = 9ai9   #默认值是PHPSESSID 我这里改成9ai9是为了和默认值区别
  session.cache_limiter = nocache #此设置确保对每个请求,在可能提供缓存的版本前,先请求发送到最初的服务器。这个值联系到下文中 cookie识别中的相关参数
  2.haproxy三种方法保持客户端session一致
  2.1 用户IP 识别
  haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)
  配置指令      balance source
  实例访问http://sourceip.9ai9.net:8080
  2.2 cookie 识别

  haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE>  配置指令例举cookieSESSION_COOKIEinsert indirect nocache
  http://cookie.9ai9.net:8080
  用firebug可以观察到用户的请求头的cookie里 有类似" Cookie 9ai9=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=12" SESSION_COOKIE=12就是haproxy添加的内容
  2.3 session 识别
  haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。
  配置指令例举 appsession 9ai9 len 64 timeout 5h request-learn
  注意 9ai9 这个值替换成 你的php.ini 里session.name的值。

页: [1]
查看完整版本: haproxy解决多主机session共享问题 的三种方法