nginx_session共享的两种解决办法

为什么负载均衡后要共享session

上一节提到了负载均衡,可以通过nginx将请求分发到不同的tomcat上,但是负载均衡后就会存在一个问题,如果用户第一次访问的是服务器1,但是第二次访问的时候被分配给服务器2,那么就显示他没有登录,用户体验就会很差。

方法一:ip_hash

ip_hash即就是通过标记IP地址,如果请求来自同一ip就会分发到同一个服务器上。但是该方案由两个弊端:

  1. 如果大量的请求来自同一个局域网,那么负载均衡就失去意义了。
  2. 如果其中的一个服务器宕机了,那么只能分配到另一个服务器了,此时还会出现上述的问题。
    实现如下:
    1
    2
    3
    4
    5
    upstream tomcat_8111_82222{
    server 127.0.0.1:8111 weight=2;
    server 127.0.0.1:8222 weight=2;
    ip hash;
    }

方法二:redis+tomcat-sessoin-manager

第二种方案就是使用redis来存取session实现session共享。
步骤如下:

  1. 启动自己的本地的redis服务。
  2. 下载tomcat读取redis需要的jar包并进行配置。
    需要用到jar包:

    jedis-2.5.2.jar,
    commons-pool2-2.0.jar,
    tomcat-redis-session-manager1.2.jar

将下载好的jar包放到tomcat的lib目录。
然后修改tomcat的context.xml文件。

1
2
3
4
5
6
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />

文章作者: Anders Cao
文章链接: http://yoursite.com/2019/03/31/session共享的两种解决办法/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Anders's Blog
打赏
  • 微信
  • 支付寶