11、nginx+tomcat+redis_session共享
11.1、前言:
1、多个tomcat要一起协同工作可以考虑的方案如下:
(1)使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,
在大并发下表现并不好。
(2)利用nginx的基于访问ip的hash路由策略,保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。但如果应用是
某一个局域网大量用户同时登录,这样负载均衡就没什么作用了。
(3)利用redis把多个tomcat的session集中管理,前端再利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时
又能保证较高的性能。
2、分布式Session管理的必要性:
Web应用在单机部署的情况下,Session是被单个应用服务器存储管理的,由于只有一个应用服务器,用户的所有请求都是通过
它进行响应处理的,所以能够很容易实现会话跟踪和保持。随着业务量的增长,系统架构需要做出调整以适应发展的需要,可能
会使用分布式架构或微服务架构,无论使用哪种架构方式,应用系统单机部署的模式已经不能满足需求,所以会将应用系统部署
到多台应用服务器上,用户的请求也会通过负载均衡转发到某个具体应用服务器上执行,可能会出现在A1系统登录后创建并保存
Session,再次发起请求,请求被转发到A2系统上显示未登录的情况,此时单机部署模式下的Session机制已不能满足要求。所以,
在分布式架构或微服务架构下,必须保证一个应用服务器上保存Session后,其它应用服务器可以同步或共享这个Session。
3、分布式Session有如下几种实现方式:
(1)Session复制机制:
在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其它Web服务器上,达到每个Web
服务器上都保存一致的Session。
1)优点:代码上不需要做支持和修改。
2)缺点:需要依赖支持的Web服务器,一旦更换成不支持的Web服务器就不能使用了,在数据量很大的情况下不仅占用网络资源,
而且会导致延迟。
3)适用场景:只适用于Web服务器比较少且Session数据量少的情况。
4)可用方案:开源方案tomcat-redis-session-manager。
(2)Session粘滞机制:
将用户的每次请求都通过某种方法强制分发到某一个Web服务器上,只要这个Web服务器上存储了对应Session数据,就可以实现
会话跟踪。
1)优点:使用简单,没有额外开销。
2)缺点:一旦某个Web服务器重启或宕机,相对应的Session数据将会丢失,而且需要依赖负载均衡机制。
3)适用场景:对稳定性要求不是很高的业务情景。
(3)Session集中管理机制:
在单独的服务器或服务器集群上使用缓存技术,如Redis存储Session数据,集中管理所有的Session,所有的Web服务器都从这个
存储介质中存取对应的Session,实现Session共享。
1)优点:可靠性高,减少Web服务器的资源开销。
2)缺点:实现上有些复杂,配置较多。
3)适用场景:Web服务器较多、要求高可用性的情况。
4)可用方案:开源方案Spring Session,也可以自己实现,主要是重写 HttpServletRequestWrapper中的getSession方法。
(4)基于Cookie管理机制:
这种方式每次发起请求的时候都需要将Session数据放到Cookie中传递给服务端。
1)优点:不需要依赖额外外部存储,不需要额外配置。
2)缺点:不安全,易被盗取或篡改;Cookie数量和长度有限制,需要消耗更多网络带宽。
3)适用场景:数据不重要、不敏感且数据量小的情况。
(5)总结:
以上四种方式,相对来说,Session集中管理更加可靠,使用也是最多的。
4、基本环境:
主机名 |
IP地址 |
安装服务 |
slave-node1 |
172.16.1.91 |
nginx1.16.0(负载均衡)、tomcat8.5.37(8080、8081实例)、redis5.0.0(session存储)、jdk1.8.0_212 |
nginx(负载均衡)、tomcat(8080、8081实例)、redis、jdk 软件的安装这里就不赘述了,本文主要讲
如何通过 redis 实现 tomcat 8080、tomcat 8081 实例的 session 共享。
5、架构图:
11.2、配置:
1、下载实现 tomcat session 共享所需的依赖包:
(1)下载地址:https://github.com/cc-chen/tomcat8.5-redis-session-manager
(2)下载后的安装包如下:
注意:不同的tomcat版本所使用的tomcat-redis-session-manager.jar的版本可能不同,否则会出现错误。
2、将下载的3个jar包分别上传到tomcat多实例的lib目录下:
[root@slave-node1 ~]# cd /application/tomcat-8080/lib/
[root@slave-node1 lib]# rz -y
[root@slave-node1 lib]# cd /application/tomcat-8081/lib/
[root@slave-node1 lib]# rz -y
3、分别在tomcat多实例的context.xml文件中的<Context>标签下添加如下内容:
<Valve className="com.s.tomcat.redissessions.RedisSessionHandlerValve"/>
<Manager className="com.s.tomcat.redissessions.RedisSessionManager"
host="172.16.1.91"
port="6379"
database="0"
password="root"
maxInactiveInterval="60" />
注释:
host:redis的主机IP。
port:redis的端口号。
database:使用redis第几个数据库。
password:redis的连接密码,如果redis没有设置访问密码,需要将改参数注释掉。
maxInactiveInterval:redis超时时间为60秒,60秒后就会变化session值。
[root@slave-node1 lib]# cd /application/
[root@slave-node1 application]# vim tomcat-8080/conf/context.xml
[root@slave-node1 application]# vim tomcat-8081/conf/context.xml
4、创建测试页面:
[root@slave-node1 application]# vim /data/www/tomcat/ROOT/test.jsp
Server Info:
SessionID:<%=session.getId()%>
<br>
SessionIP:<%=request.getServerName()%>
<br>
SessionPort:<%=request.getServerPort()%>
<br>
<%
out.println("lc");
//标记后端节点
%>
[root@slave-node1 application]# chown -R tomcat.tomcat /data/www/tomcat/
# 为测试页面赋权
11.3、启动相关服务:
1、启动redis服务:
[root@slave-node1 application]# redis-server /data/6379/redis.conf
2、启动tomcat多实例:
[root@slave-node1 application]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 10s;done
3、启动nginx服务:
[root@slave-node1 application]# /application/nginx/sbin/nginx
4、查看启动服务的端口号:
[root@slave-node1 application]# netstat -tunllp | grep -E "6379|8080|8081|80"
11.4、测试:
1、在浏览器中使用nginx负载均衡访问test.jsp测试文件:
#无论怎么刷新,SessionID值都不会变。
2、在浏览器中使用8080端口访问test.jsp测试文件:
3、在浏览器中使用8081端口访问test.jsp测试文件:
4、在redis服务器上查看存储的SessionID:
[root@slave-node1 application]# redis-cli -h 172.16.1.91 -p 6379
#存储的SessionID和上面个验证的结果一致。
5、综上测试,说明 nginx+tomcat+redis_session 共享搭建成功。
11.5、补充-tomcat7操作:
1、以上实验用的是tomcat8.5,如果是tomcat7的话需要更换tomcat8.5-redis-session-manager.jar
为tomcat-redis-session-manager-1.2-tomcat-7.jar,下载地址为如下:
https://github.com/downloads/jcoleman/tomcat-redis-session-manager/tomcat-redis-session-manager-1.2-tomcat-7.jar
https://github.com/jcoleman/tomcat-redis-session-manager/downloads?spm=a2c4e.10696291.0.0.28dc19a4cr7dVp
2、分别在tomcat多实例的context.xml文件中的<Context>标签下添加如下内容:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="172.16.1.91"
port="6379"
database="0"
password="root"
maxInactiveInterval="60" />
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏