如何解决Nginx的session一致性问题

https://www.2cto.com/net/201704/634293.html



【需求】

如下图,当用户发送请求的时候,经过nginx服务器,nginx使用负载均衡把请求分发到不同的机器tomcat1或者tomcat2里,这个时候会话id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况。

这里写图片描述

【解决】

方案一:会话保持模块,即通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器,即可解决session取不到、session不一致的问题。

方案二:Session共享(推荐使用),即服务器在分发请求到了一台机器的时候,会先去session缓存数据库查看是否有该用户的session,如果有则取出,否则新建一个。那么这个Session共享如何解决呢?共有2种方法:1、memcached缓存方案。2、redis缓存方案。下面重点介绍session共享的问题:

1、memcached缓存方案

memcached缓存数据库是专门管理session的,memcached 缓存服务可以和tomcat整合,帮助tomcat 共享管理session。

安装memcached:

# yum –y install memcached

启动memcached(默认端口是11211):

# service memcached start

通过telnet测试memcached数据库

# telnet localhost 11211

测试

set abc 0 0 5

12345

get abc

quit

将memcached的jar包拷贝到tomcat的lib下,jar包的下载地址:http://download.csdn.net/detail/chenweijisun/9826940

在tomcat的server.xml中配置jvmRoute

在tomcat的context.xml的Context配置Manager

为了方便测试,index.jsp也配置下,文件在/tomcat安装目录/webapps/ROOT/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

SessionID:<%=session.getId()%>

SessionIP:<%=request.getServerName()%>

tomcat2 page

测试

2、redis缓存方案

安装redis:

# yum –y install redis

修改配置文件vi /etc/redis.conf,将bind的127.0.0.1修改为本机地址,否则只能本机访问了

导入redislib中三个jar包到tomcat中,jar包的下载地址:http://download.csdn.net/detail/chenweijisun/9826941

在tomcat的context.xml的Context配置Manager


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值