haproxy的session共享方案和配置方法详解

摘要:对于一个大并发的系统,我们需要对系统做负载均衡。那么相应的就有session存储问题,Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。

服务器也通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
haproxy的session存储方案:

用户IP 轮询的方法
haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx的IP hash 指令)
配置指令 balance source
实例访问http://sourceip.ppzedu.com:8080
cookie 识别
haproxy 将WEB服务端发送给客户端的cookie中插入(或添加加前缀)haproxy定义的后端的服务器COOKIE ID。
配置指令例举 cookie SESSION_COOKIE insert indirect nocache
http://cookie.ppzedu.com:8080
用firebug可以观察到用户的请求头的cookie里 有类似" Cookie 9ai9=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=12" SESSION_COOKIE=12就是haproxy添加的内容
session 识别
haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。
配置指令例举 appsession ppzedu len 64 timeout 5h request-learn
注意 ppzedu 这个值替换成 你的php.ini 里session.name的值。
实例访问 http://appsession.ppzedu.com:8080
只做简单轮询对比
实例访问 http://nosession.ppzedu.com:8080

配置方案
案例如下:

这里粘贴一个测试用的代码
本实验中使用到相同的index.php代码 如下

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: