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 ID。

配置指令例举  cookie  SESSION_COOKIE  insert 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的值。

实例访问 http://appsession.9ai9.net:8080

  2.4 只做简单轮询对比
实例访问 http://nosession.9ai9.net:8080
3 实验环境及结构
CentOS 5.3 64
haproxy  113.106.185.245
WEB1 REALsrv_70  184.82.239.70
WEB2  REALsrv_120 220.162.237.120  
4 安装配置及管理

useradd -M -s /sbin/nologin haproxy
wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.13.tar.gz
tar zxvf haproxy-1.4.13.tar.gz
cd haproxy-1.4.13
make TARGET=linux26 PREFIX=/usr/local/haproxy install
mkdir /usr/local/haproxy/conf
vim /usr/local/haproxy/conf/haproxy.cfg

 
    
  1. global 
  2.         log     127.0.0.1 local0 info  
  3.         maxconn 4096 
  4.         user    haproxy 
  5.         group   haproxy 
  6.         daemon 
  7.         nbproc  1 
  8.         pidfile /var/run/haproxy.pid 
  9. defaults 
  10.         mode    http 
  11.         maxconn         2000 
  12.         contimeout      5000 
  13.         clitimeout      30000 
  14.         srvtimeout      30000 
  15.         option          httplog 
  16.         option          redispatch 
  17.         option          abortonclose 
  18.         retries         3 
  19. listen admin_stats 
  20.         bind 113.106.185.245:443 
  21.         mode http 
  22.         log 127.0.0.1 local0 err 
  23.         stats   uri     /qhappy_stats 
  24.         stats   realm   9ai9.net\ Qhappy 
  25.         stats   auth    qhappy:qhappy 
  26.         stats   refresh   5s  
  27. listen site_status 
  28.         bind 113.106.185.245:445 
  29.         mode http 
  30.         log  127.0.0.1 local0 err 
  31.         monitor-uri     /site_status 
  32. frontend  WEB_SITE 
  33.         bind    0.0.0.0:8080 
  34.         mode    http 
  35.         log     global 
  36.         option  httplog 
  37.         option  httpclose 
  38.         option  forwardfor 
  39.         acl     COOKIE          hdr_reg(host)   -i ^(cookie.9ai9.net) 
  40.         acl     SOURCE          hdr_reg(host)   -i ^(sourceip.9ai9.net) 
  41.         acl     APPSESSION      hdr_reg(host)   -i ^(appsession.9ai9.net) 
  42.         acl     NOSESSION       hdr_reg(host)   -i ^(nosession.9ai9.net) 
  43.         use_backend COOKIE_srv          if COOKIE 
  44.         use_backend SOURCE_srv          if SOURCE 
  45.         use_backend APPSESSION_srv      if APPSESSION 
  46.         use_backend NOSESSION_srv       if NOSESSION 
  47. #        default_backend ai_server 
  48. backend COOKIE_srv 
  49.         mode    http 
  50.         cookie  SESSION_COOKIE  insert indirect nocache 
  51.        server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1 
  52.        server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1 
  53. backend SOURCE_srv 
  54.         mode    http 
  55.        balance source 
  56.        server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1 
  57.        server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1 
  58. backend APPSESSION_srv 
  59.        mode    http 
  60.        appsession 9ai9 len 64 timeout 5h request-learn 
  61.        server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1 
  62.        server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1 
  63.  
  64. backend NOSESSION_srv 
  65.        mode    http 
  66.         balance roundrobin 
  67.        server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1 
  68.        server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1 
  69. backend ai_server 
  70.        mode    http 
  71.        balance roundrobin 
  72.        cookie  SERVERID 
  73.        server REALsrv_70 184.82.239.70:80 cookie 2 check inter 1500 rise 3 fall 3 weight 1 
  74.        server REALsrv_120 220.162.237.120:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1 

haproxy 启动重启等管理脚本


cd /etc/init.d/
wget http://www.9ai9.net/download/shell/haproxy
chmod 755 haproxy
chkconfig --add haproxy

本文转载:http://bbs.linuxtone.org/thread-9526-1-1.html