Tomcat之session解决方案

session方案及配置

用户访问服务器资源主要分成两类,一类是无状态访问,例如请求一张图片。另一类是有状态访问,这种情况下,服务器需要记录追踪用户状态,并根据用户所处状态做出不同响应,典型的例子是购物车。Session的作用就是在Web服务器上保持用户的状态信息。

用户请求连接服务器时,服务器会生成一个唯一的sessionID为标识符至用户端本地,客户端使用该sessionID来存/取服务器端的session空间。sessionID是客户端浏览器cookie保存的。

当客户端访问Tomcat集群时,所有的请求将被Nginx拦截,由Nginx做负载均衡后转发给后台真实Tomcat。按照这个流程就可能出现一个问题,当用户进行页面刷新或跳转时,每次请求将被转发给不同的Tomcat处理,这样就会造成Session的不同步。举个简单的栗子,例如当用户往购物车添加商品时,兴高采烈地准备买单了,当他跳转到付款页面却发现购物车被清空了,这就是Session丢失的典型栗子。因此,我们需要为集群环境做Session同步。

单机环境下,session可有部署在服务器上的web容器如:Tomcat进行保存管理。但在使用负载均衡集群时如架构前端Nginx来负载均衡后端多台Tomcat,所以可能分发到任何一台后端的Tomcat;虽然呢,也有类似于Nginx中的ip_hash算法可以将客户端和服务器做一个绑定,但是弊端太多,生产环境慎用。

下面将介绍几种session的方案

一、session绑定

session绑定就是利用负载均衡服务器的hash源IP地址算法实现,将来源于同一个IP的请求总是分发到同一台后端web服务器上,又称为会话粘滞。 但是如果该服务器死机或故障,那该用户的session空间也就不复存在了,就如我们网页浏览购物网站时,刚添加到购物车的宝贝,一刷新全没了,用户体验肯定非常差,所以该session绑定方案使用场景非常有限

#编辑nginx主配置文件 upstream tomcats { ip_hash #使用ip_hash算法调度   server 192.168.111.4:8080;   server 192.168.111.5:8080;   } 二、session复制

适用于小型架构的服务器集群。开启web服务器的session复制功能,在集群中的几台服务器之间同步session对象,这样每台服务器都保存了用户的session信息,但是当集群规模比较大时,session复制机制会消耗大量系统资源以及网络资源

操作系统IP地址软件版本主机名
CentOS7   192.168.111.3   nginx1.14.2   Nginx  
centos7   192.168.111.4   JDK1.7;Tomcat7.0.54   tnode1  
centos7   192.168.111.5   JDK1.7;Tomcat7.0.54   tnode2  

如有防火墙或selinux记得关闭或者修改相应规则

[root@localhost ~]# nginx -v nginx version: nginx/1.14.2 [root@localhost ~]# vim /etc/hosts 192.168.111.3 nginx 192.168.111.4 tnode1 192.168.111.5 tnode2 [root@localhost ~]# scp /etc/hosts 192.168.111.4:/etc/ [root@localhost ~]# scp /etc/hosts 192.168.111.5:/etc/ #配置hosts文件 #hostname nginx #hostname tnode1 #hostname tnode2 修改主机名 [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf http { ... upstream tomcatpool { server 192.168.111.4:8080 weight=1 max_fails=1 fail_timeout=10s; server 192.168.111.5:8080 weight=1 max_fails=1 fail_timeout=10s; } #以上为添加 location / { root html; index index.html index.htm; proxy_pass ; } #以上为修改添加最下面一行调用池 安装配置Tomcat。 [root@tnode1 ~]# tar zxf jdk-7u65-linux-x64.tar.gz [root@tnode1 ~]# mv jdk1.7.0_65/ /usr/local/java7 [root@tnode1 ~]# echo "PATH=$PATH:/usr/local/java7/bin" >> /etc/profile [root@tnode1 ~]# source /etc/profile [root@tnode1 ~]# rm -rf /usr/bin/java [root@tnode1 ~]# java -version java version "1.7.0_65" Java(TM) SE Runtime Environment (build 1.7.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode) [root@tnode1 ~]# tar zxf apache-tomcat-7.0.54.tar.gz [root@tnode1 ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat7 [root@tnode2 ~]# tar zxf jdk-7u65-linux-x64.tar.gz [root@tnode2 ~]# mv jdk1.7.0_65/ /usr/local/java7 [root@tnode2 ~]# echo "PATH=$PATH:/usr/local/java7/bin" >> /etc/profile [root@tnode2 ~]# source /etc/profile [root@tnode2 ~]# rm -rf /usr/bin/java [root@tnode1 ~]# java -version java version "1.7.0_65" Java(TM) SE Runtime Environment (build 1.7.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode) [root@tnode2 ~]# tar zxf apache-tomcat-7.0.54.tar.gz [root@tnode2 ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat7 [root@tnode1 ~]# vim /usr/local/tomcat7/webapps/ROOT/session.jsp #测试页面 Session ID:<%= session.getId() %><BR> SessionPort:<%= request.getServerPort() %> <% out.println("This tomcat server 192.168.111.4");%> [root@tnode2 ~]# vim /usr/local/tomcat7/webapps/ROOT/session.jsp Session ID:<%= session.getId() %><BR> SessionPort:<%= request.getServerPort() %> <% out.println("This tomcat server 192.168.111.5");%> #这是一个获取当前服务器所拥有的IP和sessionID的脚本页面 下面开始配置session复制(生产环境时一般10台以下使用该session解决方案 [root@tnode1 ~]# vim /usr/local/tomcat7/conf/server.xml 104 <Engine defaultHost="localhost" jvmRoute="tnode1"> #改行后面添加jvmroute配置项。 109 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> #去掉注释 [root@tnode1 ~]# vim /usr/local/tomcat7/webapps/ROOT/WEB-INF/web.xml </description> #添加至倒数第二行 [root@tnode2 ~]# vim /usr/local/tomcat7/conf/server.xml <Engine defaultHost="localhost" jvmRoute="tnode2"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> [root@tnode1 ~]# vim /usr/local/tomcat7/webapps/ROOT/WEB-INF/web.xml </description> #添加至倒数第二行 [root@tnode1 ~]# /usr/local/tomcat7/bin/shutdown.sh [root@tnode1 ~]# /usr/local/tomcat7/bin/startup.sh [root@tnode2 ~]# /usr/local/tomcat7/bin/shutdown.sh [root@tnode2 ~]# /usr/local/tomcat7/bin/startup.sh 客户端使用火狐浏览器输入:来进行测试,并且刷新(别强制刷新,那样是新的sessionID) 三、使用memcached解决session问题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/251de06860d2c058fcd639d33447dd0c.html