• haproxy有关session的问题


    在实验的时候遇到一个问题就是当我登录网站的时候,然后我再刷新一下,用户的状态就退出了

    我现在的框架是这样的,前面有一台haproxy作为反向代理,后面有两台服务器跑的是java应用。后面两台服务器做的是一个负载均衡

    现在要解决这个问题就是用haproxy 的session的方法来解决

    原文参照

    http://bbs.linuxtone.org/thread-9526-1-1.html
    http://lxsym.blog.51cto.com/1364623/852400
    本帖最后由 snifferqq 于 2011-4-6 11:22 编辑
    
    
    haproxy 解决 多主机session共享问题 的三种方法
    1 session知识储备
    2 haproxy三种方法保持客户端session一致
    3 实验环境及结构
    4 安装配置及管理
    5 本实验中使用到相同的index.php代码
    6 联系方法及扩展阅读
    感谢 不就是要我命 QQ 47034839 提供测试主机 
    
    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
    global
            log     127.0.0.1 local0 info 
            maxconn 4096
            user    haproxy
            group   haproxy
            daemon
            nbproc  1
            pidfile /var/run/haproxy.pid
    defaults
            mode    http
            maxconn         2000
            contimeout      5000
            clitimeout      30000
            srvtimeout      30000
            option          httplog
            option          redispatch
            option          abortonclose
            retries         3
    listen admin_stats
            bind 113.106.185.245:443
            mode http
            log 127.0.0.1 local0 err
            stats   uri     /qhappy_stats
            stats   realm   9ai9.net Qhappy
            stats   auth    qhappy:qhappy
            stats   refresh   5s 
    listen site_status
            bind 113.106.185.245:445
            mode http
            log  127.0.0.1 local0 err
            monitor-uri     /site_status
    frontend  WEB_SITE
            bind    0.0.0.0:8080
            mode    http
            log     global
            option  httplog
            option  httpclose
            option  forwardfor
            acl     COOKIE          hdr_reg(host)   -i ^(cookie.9ai9.net)
            acl     SOURCE          hdr_reg(host)   -i ^(sourceip.9ai9.net)
            acl     APPSESSION      hdr_reg(host)   -i ^(appsession.9ai9.net)
            acl     NOSESSION       hdr_reg(host)   -i ^(nosession.9ai9.net)
            use_backend COOKIE_srv          if COOKIE
            use_backend SOURCE_srv          if SOURCE
            use_backend APPSESSION_srv      if APPSESSION
            use_backend NOSESSION_srv       if NOSESSION
    #        default_backend ai_server
    backend COOKIE_srv
            mode    http
            cookie  SESSION_COOKIE  insert indirect nocache
           server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1
           server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1
    backend SOURCE_srv
            mode    http
           balance source
           server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1
           server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1
    backend APPSESSION_srv
           mode    http
           appsession 9ai9 len 64 timeout 5h request-learn
           server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1
           server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1
    
    backend NOSESSION_srv
           mode    http
            balance roundrobin
           server REALsrv_70       184.82.239.70:80 cookie 11 check inter 1500 rise 3 fall 3 weight 1
           server REALsrv_120      220.162.237.120:80 cookie 12 check inter 1500 rise 3 fall 3 weight 1
    backend ai_server
           mode    http
           balance roundrobin
           cookie  SERVERID
           server REALsrv_70 184.82.239.70:80 cookie 2 check inter 1500 rise 3 fall 3 weight 1
           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
    
    使用方法 你懂的
    /etc/init.d/haproxy {start|stop|status|checkconfig|restart|try-restart|reload|force-reload}
    
    5 本实验中使用到相同的index.php代码 如下
    <?php
    session_start();
    $_SESSION['time'] =date("Y:m:d:H:s",time());
    echo "本次访问时间"."<font color=red>".$_SESSION['time']."</font>"."<br>";
    echo "访问的服务器地址是"."<font color=red>".$_SERVER['SERVER_ADDR']."</font>"."<br>";
    echo "访问的服务器域名是"."<font color=red>".$_SERVER['SERVER_NAME']."</font>"."<br>";
    echo "SESSIONNAME是"."<font color=red>".session_name()."</font>"."<br>";
    echo "SESSIONID是"."<font color=red>".session_id()."</font>"."<br>";
    ?>
    复制代码
    6 联系方法及扩展阅读
    笔者 水煮鱼@溢  微博 http://t.qq.com/cllxy1234 欢迎收听
    haproxy 官网 http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
    董旗宇  http://www.9ai9.net/download/art/HAProxy配置使用说明.pdf   
    刘天斯  http://blog.liuts.com/post/223/
    linuxtone http://bbs.linuxtone.org/thread-73-1-1.html
    View Code
    backend                 h5.kongzfinance.com
            balance roundrobin
            appsession JSESSIONID len 64 timeout 5h request-learn
            option      httpchk GET /test HTTP/1.0
            server     10.5.25.14:7013 10.5.25.174:7013 check inter 60000 rise 2 fall 5 weight 10
            server     10.5.16.42:7013  10.5.16.42:7013 check inter 60000 rise 2 fall 5 weight 10

    这里的JSESSIONID 是后端程序的session.name

    比如说这里我们打开一个我们的测试网站的链接地址

    然后按F12

    我们复制一下cookie的内容看一下

     

    然后这里们然后重启一下haproxy,然后我们再次访问一下

  • 相关阅读:
    小项目心得交流
    自己写的web标准教程,帮你走进web标准设计的世界——第三讲(html终结篇)
    css之清除区域
    面向对象大作业(自主选题)
    关于vue在hash模式偶发不能后退的处理
    flex布局设置单个子元素靠右
    css 选择器
    Git常用命令及方法大全
    解决微信sdk之uploadImage上传多张图片时循环提示“上传中”
    grid 布局
  • 原文地址:https://www.cnblogs.com/smail-bao/p/6293137.html
Copyright © 2020-2023  润新知