如何解决Nginx的session一致性问题
2017-04-26 22:51
633 查看
【需求】
如下图,当用户发送请求的时候,经过nginx服务器,nginx使用负载均衡把请求分发到不同的机器tomcat1或者tomcat2里,这个时候会话id 在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/11/1eedc821957da0f2ca0d627165ca9ddd)
【解决】
方案一:会话保持模块,即通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器,即可解决session取不到、session不一致的问题。
方案二:Session共享(推荐使用),即服务器在分发请求到了一台机器的时候,会先去session缓存数据库查看是否有该用户的session,如果有则取出,否则新建一个。那么这个Session共享如何解决呢?共有2种方法:1、memcached缓存方案。2、redis缓存方案。下面重点介绍session共享的问题:
1、memcached缓存方案
memcached缓存数据库是专门管理session的,memcached 缓存服务可以和tomcat整合,帮助tomcat 共享管理session。
安装memcached:
启动memcached(默认端口是11211):
通过telnet测试memcached数据库
测试
将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
测试
2、redis缓存方案
安装redis:
启动redis
测试(redis的默认端口是6379):
修改配置文件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
如下图,当用户发送请求的时候,经过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
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
在tomcat的context.xml的Context配置Manager
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.17.4:11211" sticky="false" lockingMode="auto" sessionBackupAsync="false" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
为了方便测试,index.jsp也配置下,文件在/tomcat安装目录/webapps/ROOT/index.jsp
<%@ page language="java" contentT a7df ype="text/html; charset=UTF-8" pageEncoding="UTF-8"%> SessionID:<%=session.getId()%> <br/> SessionIP:<%=request.getServerName()%> <br/> <h1>tomcat2 page</h1>
测试
2、redis缓存方案
安装redis:
# yum –y install redis
启动redis
# service redis start
测试(redis的默认端口是6379):
# telnet localhost 6379
修改配置文件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
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.17.4" port="6379" database="0" maxInactiveInterval="60" />
相关文章推荐
- 如何解决Nginx的session一致性问题
- 如何解决session容易丢失的问题【转】
- LVS/Nginx如何处理session问题
- Nginx+resin session问题解决
- nginx 解决session共享问题(jvm-route)方式(其实没有真正解决共享问题)
- nginx 负载均衡 使用ip_hash方式解决session问题 测试
- nginx+resin session 问题解决 推荐
- 采用nginx_upstream_jvm_route模块解决tomcat多节点session不一致问题
- 如何解决分布式系统数据事务一致性问题(HBase加Solr)
- nginx做负载均衡时的session问题解决办法jvm-route原理
- 关于如何解决Global.asax中Session_Start不执行的问题
- nginx 解决session共享问题(jvm-route)方式
- ECSHOP如何解决购物车中商品自动消失问题 session 失效 丢失的问题
- 如何解决resin与nginx共用同一端口的问题
- [HAProxy]解决haproxy 多客户端session一致性问题
- 如何解决不同的webApp的session 共享问题
- nginx的upstream(解决session问题)
- Nginx的session一致性问题
- 在集群中部署多个服务器如何解决SESSION问题?
- 如何解决 asp.net session 丢失问题