• Nginx Session共享《五》


    1.概念

      在上一篇nginx负载均衡中,会出现一个bug: 当同一个用户第一次访问tomcat_8001 并且登录成功, 而第二次访问却被分配到了tomcat_8002, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了

    2.解决方法一:ip_hash

      通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
    这样就不会出现负载均衡session的bug了. 处理手段也很简单,如下图所示在upstream最后加上ip_hash;就行了。

      

    upstream tomcat_8001_8002{
            server 127.0.0.1:8001 weight=1;
            server 127.0.0.1:8002 weight=2;    
            ip_hash;
    }
    

      不过这种方案并不完美,当如下几种情况发生时就有问题:
      1. 大量请求来之某个局域网,那么相当于就没有负载均衡了
      2. 如果tomcat_8001 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。

      解决方法二:redis+tomcat-sessoin-manager

      用Redis来存取session,这样当tomcat_8001需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。

      准备三个jar:tomcat-redis-session-manager1.2.jar(核心)、jedis-2.5.2.jar、commons-pool2-2.0.jar,都放在tomcat/lib目录下,两个tomcat都要放

      下载地址:https://share.weiyun.com/b41856840db4d696649f6020d34cb245

      修改tomcat/conf目录下的context.xml文件,新增:

      

    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />  
    <Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
             host="localhost"   
             port="6379"  
             database="0"   
             maxInactiveInterval="60" />
    

      重启两个tomcat(带有登陆页),访问http://127.0.0.1

      输入登陆信息,然后关闭之前被访问的tomcat,在访问http://127.0.0.1

      发现跳转到已经是登陆的信息页面了,说明配置成功。

    3.实际项目中的session共享

      通常项目都是由开源框架搭建的,其中spring是必不可少,而spring本身就支持redis,引入相关jar,写相关配置文件即可

      具体实施步骤,等下一章写。

      

      

      

      

      

      

  • 相关阅读:
    C# SQLiteHelper
    C# 自定义等待窗口
    C# Work PPT to PDF
    SQL 分隔字符串
    SQL 客户端查看
    SQL 自定义四舍五入
    SQL 并联更新
    C# 委托简单例子
    每天一个Linux命令(52)telnet命令
    每天一个Linux命令(51)ss命令
  • 原文地址:https://www.cnblogs.com/yixtx/p/8386525.html
Copyright © 2020-2023  润新知