1. 首页
  2. IT资讯

nginx+tomcat会话保持方案探讨

“u003Cdivu003Eu003Cpu003Etomcat做为轻量级的java应用服务器,对静态页面和大并发的处理并不是很好。所以现在流行的做法是使用nginx+tomcat来实现动静分离与负载均衡, 做负载均衡集群就要考虑会话保持。u003Cu002Fpu003Eu003Cpu003E一、Session概述u003Cu002Fpu003Eu003Cpu003E1、什么是会话(session)?u003Cu002Fpu003Eu003Cpu003E答: Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制。u003Cu002Fpu003Eu003Cpu003Ehttp协议是无状态的,无状态就表明每一次客户端的访问请求是无关联的。比如张三在一个网站上有多次访问请求,李四也在这个网站上有多次访问请求,他们的请求顺序与时间是无规则的。那么网站服务器是不知道到底哪些是张三的请求,哪些是李四的请求。如果在他们请求时服务器都有一个固定的标签跟踪,就能分辨了。这个标签就可以看做是session.u003Cu002Fpu003Eu003Cpu003E2、为什么要会话保持?u003Cu002Fpu003Eu003Cpu003E答: 因为负载均衡集群会将同一个用户的请求通过算法调度给多台服务器,变成了一对多的局面。就好像我要给父母打电话,父母原来使用同一个电话变成了父母各使用一个电话,我说的话,被一半一半的调度给父母各自持有的电话上。那么最终的结果就是父母各听了一半,根本不知道我要说什么。u003Cu002Fpu003Eu003Cpu003E所以负载均衡和会话保持是矛盾的,但又必须得共存。u003Cu002Fpu003Eu003Cpu003E二、会话保持的几个方案:u003Cu002Fpu003Eu003Cpu003E1、nginx的ip_hash算法u003Cu002Fpu003Eu003Cpu003E实现原理就是同一个客户端的所有请求只调度给同一个后台tomcat,这样会话就能保持在同一台服务器上。u003Cu002Fpu003Eu003Cpu003E注:其它的负载均衡软件也有类似算法:如LVS的sh算法,haproxy的source算法等。u003Cu002Fpu003Eu003Cpu003E优点:配置最简单,在nginx的upstream调度里加一句ip_hash即可u003Cu002Fpu003Eu003Cpu003E缺点:后端tomcat宕机,用户session会丢失u003Cu002Fpu003Eu003Cpu003E2、tomcat的session复制集群u003Cu002Fpu003Eu003Cpu003E多台tomcat通过组播互相沟通会话信息,以保持不同tomcat之间的会话一致性。u003Cu002Fpu003Eu003Cpu003E优点:后端tomcat宕机,用户session不丢失u003Cu002Fpu003Eu003Cpu003E缺点:使用组播将信息复制到多个tomcat节点,网络开销大u003Cu002Fpu003Eu003Cpu003E3、缓存集中式管理sessionu003Cu002Fpu003Eu003Cpu003Esession可以保存在文件,数据库和内存中,利用memcached或redis将session信息缓存,以达到会话信息不丢失,也不影响负载均衡的目的。u003Cu002Fpu003Eu003Cpu003E优点:只要缓存服务器没问题,用户session不会丢.也没有额外的网络开销u003Cu002Fpu003Eu003Cpu003E缺点:太依赖缓存服务器;需要额外的缓存服务器,成本也高;当然要求维护人员技术水平也较高,适合于性能要求高的大型环境。u003Cu002Fpu003Eu003Cpu003E三、使用MSM实现nginx+tomcat集群的会话保持u003Cu002Fpu003Eu003Cpu003E1、MSM是什么?u003Cu002Fpu003Eu003Cpu003EMSM(memcached-session-manager)就是缓存集中式管理session的一种方案 ,它可以把tomcat的会话信息保存在缓存服务器memcached中,实现在负载均衡调度时还能保持会话一致。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fcafc139eb65d4ab7954c2d41996e4340″ img_width=”554″ img_height=”300″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E2、实验准备:u003Cu002Fpu003Eu003Cpu003E① 静态ipu003Cu002Fpu003Eu003Cpu003E10.1.1.11 http:u002Fu002Fnginx.cluster.comu003Cu002Fpu003Eu003Cpu003E10.1.1.12 http:u002Fu002Ftomcat1.cluster.comu003Cu002Fpu003Eu003Cpu003E10.1.1.13 http:u002Fu002Ftomcat2.cluster.comu003Cu002Fpu003Eu003Cpu003E10.1.1.14 http:u002Fu002Fmemcached.cluster.comu003Cu002Fpu003Eu003Cpu003E② 主机名绑定u003Cu002Fpu003Eu003Cpu003E③ 关闭防火墙和Selinuxu003Cu002Fpu003Eu003Cpu003E④ 时间同步u003Cu002Fpu003Eu003Cpu003E⑤ yum源(centos7安装完系统后的默认yum源就OK)u003Cu002Fpu003Eu003Cpu003E3、实验过程u003Cu002Fpu003Eu003Cpu003E第1步: 在所有tomcat节点上安装u003Cu002Fpu003Eu003Cpu003E首先在官网下载二进制版tomcatu003Cu002Fpu003Eu003Cpu003E下载地址: https:u002Fu002Ftomcat.apache.orgu002Fdownload-90.cgiu003Cu002Fpu003Eu003Cpu003E在centos7上确认openjdk已经安装u003Cu002Fpu003Eu003Cpu003E# java -versionu003Cu002Fpu003Eu003Cpu003Eopenjdk version “1.8.0_161″u003Cu002Fpu003Eu003Cpu003EOpenJDK Runtime Environment (build 1.8.0_161-b14)u003Cu002Fpu003Eu003Cpu003EOpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)u003Cu002Fpu003Eu003Cpu003E直接解压下载好的二进制版tomcat安装并启动 u003Cu002Fpu003Eu003Cpu003E# tar xf u002Frootu002FDesktopu002Fapache-tomcat-9.0.14.tar.gz -C u002Fusru002Flocalu002Fu003Cu002Fpu003Eu003Cpu003E# mv u002Fusru002Flocalu002Fapache-tomcat-9.0.14u002F u002Fusru002Flocalu002Ftomcat u003Cu002Fpu003Eu003Cpu003E# u002Fusru002Flocalu002Ftomcatu002Fbinu002Fstartup.shu003Cu002Fpu003Eu003Cpu003E第2步:在所有tomcat节点(tomcat1和tomcat2)的家目录里创建一个显示session信息的代码文件u003Cu002Fpu003Eu003Cpu003E注:文件内容是一模一样的u003Cu002Fpu003Eu003Cpu003E[root@tomcat1 ~]# vim u002Fusru002Flocalu002Ftomcatu002Fwebappsu002FROOTu002Fsession.jspu003Cu002Fpu003Eu003Cpu003ESessionID:<%=session.getId()%> <BR>u003Cu002Fpu003Eu003Cpu003ESessionIP:<%=request.getServerName()%> <BR>u003Cu002Fpu003Eu003Cpu003ESessionPort:<%=request.getServerPort()%>u003Cu002Fpu003Eu003Cpu003E[root@tomcat2 ~]# vim u002Fusru002Flocalu002Ftomcatu002Fwebappsu002FROOTu002Fsession.jspu003Cu002Fpu003Eu003Cpu003ESessionID:<%=session.getId()%> <BR>u003Cu002Fpu003Eu003Cpu003ESessionIP:<%=request.getServerName()%> <BR>u003Cu002Fpu003Eu003Cpu003ESessionPort:<%=request.getServerPort()%>u003Cu002Fpu003Eu003Cpu003E第3步: 安装并配置nginx配置文件,实现nginx+tomcat的动静分离与负载均衡。u003Cu002Fpu003Eu003Cpu003E[root@nginx ~]# yum install epel-release -yu003Cu002Fpu003Eu003Cpu003E[root@nginx ~]# yum install nginx -yu003Cu002Fpu003Eu003Cpu003E[root@nginx ~]# vim u002Fetcu002Fnginxu002Fnginx.confu003Cu002Fpu003Eu003Cpu003E将下面一段加到http {}配置段里但是不要在server {}配置段里u003Cu002Fpu003Eu003Cpu003Eupstream tomcat {u003Cu002Fpu003Eu003Cpu003Eserver 10.1.1.12:8080 weight=1;u003Cu002Fpu003Eu003Cpu003Eserver 10.1.1.13:8080 weight=1;u003Cu002Fpu003Eu003Cpu003E}u003Cu002Fpu003Eu003Cpu003E把server {}配置段里下面一段修改u003Cu002Fpu003Eu003Cpu003Elocation u002F {u003Cu002Fpu003Eu003Cpu003E}u003Cu002Fpu003Eu003Cpu003E修改成u003Cu002Fpu003Eu003Cpu003Elocation ~ .*\.jsp$ {u003Cu002Fpu003Eu003Cpu003Eproxy_pass http:u002Fu002Ftomcat;u003Cu002Fpu003Eu003Cpu003Eproxy_set_header Host $host;u003Cu002Fpu003Eu003Cpu003Eproxy_set_header X-Forwarded-For $remote_addr;u003Cu002Fpu003Eu003Cpu003E}u003Cu002Fpu003Eu003Cpu003E最终结果如下图所示:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F94f8c166b8534226aa7214333098b984″ img_width=”554″ img_height=”302″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E第4步:启动nginx服务u003Cu002Fpu003Eu003Cpu003E[root@vm1 ~]# systemctl restart nginxu003Cu002Fpu003Eu003Cpu003E[root@vm1 ~]# systemctl enable nginxu003Cu002Fpu003Eu003Cpu003E第5步: 下载MSM相关的jar包,并拷贝到所有tomcat节点的u002Fusru002Flocalu002Ftomcatu002Flibu002F目录下u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F58e9a43e8f2e4ede8947dbc5a15343db” img_width=”473″ img_height=”346″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F221a81be2d144a79b00db132aafc7766″ img_width=”489″ img_height=”233″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F0147b060f2d84dfbbb1ff37ad685b73f” img_width=”554″ img_height=”319″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E第6步: 确认jar包都拷贝完成后,配置所有tomcat节点(tomcat1和tomcat2都一样配置)u003Cu002Fpu003Eu003Cpu003E把下面一段加到context.xml配置文件最后一行前面; 也就是<Context> <u002FContext>标签中间;10.1.1.14为memcached服务器IPu003Cu002Fpu003Eu003Cpu003E# vim u002Fusru002Flocalu002Ftomcatu002Fconfu002Fcontext.xmlu003Cu002Fpu003Eu003Cpu003E<Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”u003Cu002Fpu003Eu003Cpu003EmemcachedNodes=”n1:10.1.1.14:11211″u003Cu002Fpu003Eu003Cpu003ElockingMode=”auto”u003Cu002Fpu003Eu003Cpu003Esticky=”false”u003Cu002Fpu003Eu003Cpu003ErequestUriIgnorePattern= “.*\.(png|gif|jpg|css|js)$” u003Cu002Fpu003Eu003Cpu003EsessionBackupAsync= “false” u003Cu002Fpu003Eu003Cpu003EsessionBackupTimeout= “100” u003Cu002Fpu003Eu003Cpu003EcopyCollectionsForSerialization=”true” u003Cu002Fpu003Eu003Cpu003EtranscoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory” u002F>u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F495cdb494c8c4532ad8cfafa910eb6c6″ img_width=”554″ img_height=”250″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E第7步: 所有tomcat节点重启tomcat服务u003Cu002Fpu003Eu003Cpu003E# u002Fusru002Flocalu002Ftomcatu002Fbinu002Fshutdown.sh u003Cu002Fpu003Eu003Cpu003E# u002Fusru002Flocalu002Ftomcatu002Fbinu002Fstartup.shu003Cu002Fpu003Eu003Cpu003E第8步: 在memcached服务器上安装,并启动服务u003Cu002Fpu003Eu003Cpu003E[root@vm4 ~]# yum install memcached -yu003Cu002Fpu003Eu003Cpu003E[root@vm4 ~]# systemctl restart memcachedu003Cu002Fpu003Eu003Cpu003E[root@vm4 ~]# systemctl enable memcachedu003Cu002Fpu003Eu003Cpu003E[root@vm4 ~]# lsof -i:11211u003Cu002Fpu003Eu003Cpu003ECOMMAND PID USER FD TYPE DEVICE SIZEu002FOFF NODE NAMEu003Cu002Fpu003Eu003Cpu003Ememcached 4224 memcached 26u IPv4 44869 0t0 TCP *:memcache (LISTEN)u003Cu002Fpu003Eu003Cpu003Ememcached 4224 memcached 27u IPv6 44870 0t0 TCP *:memcache (LISTEN)u003Cu002Fpu003Eu003Cpu003Ememcached 4224 memcached 28u IPv4 44873 0t0 UDP *:memcache u003Cu002Fpu003Eu003Cpu003Ememcached 4224 memcached 29u IPv6 44874 0t0 UDP *:memcacheu003Cu002Fpu003Eu003Cpu003E第9步: 使用浏览器访问测试u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F2af8986b26d94235ae6768c265a8b6e9″ img_width=”554″ img_height=”151″ alt=”nginx+tomcat会话保持方案探讨” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E至此,会话保持就成功了。u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:nginx+tomcat会话保持方案探讨

主题测试文章,只做测试使用。发布者:玩家L-,转转请注明出处:http://www.cxybcw.com/26908.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code