因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
jdk是运行java所必需的
软件下载:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/ 拷贝jar包到/usr/local/tomcat/lib目录: 配置tomcat: # vim /usr/local/tomcat/conf/context.xml <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:172.25.0.3:11211,n2:172.25.0.4:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
实验前:server1上将openrestry的nginx关闭,打开nginx服务;server2、3上将httpd Web服务器关掉systemctl stop httpd。
1 server2、3准备安装tomcat服务器。
server2上安装tomcat:
打开tomcat服务
netstat -antlp查看端口发现8080端口(tomcat服务端口):
server3上同样安装jdk、tomcat、并启动tomcat服务:
server2、3上访问tomcat
2 nginx结合tomcat(和nginx结合httpd一样,使用负载均衡的方式)
访问.jsp页面时,通过proxy_pass调度给tomcat负载均衡器
tomcat负载均衡器(调度到server2、3的tomcat服务器,类似于LVS调度给server2、3的httpd上)
实验1: 没图片是因为只有.jsp页面的才提交给tomcat,图片不是jsp结尾,所以不显示
实验2:访问test.jsp:
server2 、3tomcat默认发布目录里面添加test.jsp,用来记录cession列表信息,
server2上tomcat挂了,由于访问的是ngnix对后端有健康监测,所以会调度到server3,但是存入server2内存的信息没了,用户端提交信息丢了,虽然服务端没报错但是用户体验感下降(购物车里的东西没了)。现在不存在这样问题,cession共享了。
解决实验2问题:当server2挂掉后,server2上面内存原有cession信息可以被server3获取
如果使用一个共享存储会浪费资源。
nginx+tomcat+memcache交叉存储
memcache只是临时存tomcat的信息,必能持久化。
nginx在server1上,T1和M1在结点server2上,T2和M2在节点server3上。
nginx负载均衡,tomcat1(T1)将session信息存储在memcache2(M2)上。只有当M2不可用时,T1才将session存储在M1上。T2类似,只有当M1不可用时,才把session信息存储在M2上。使用这种配置的好处是,当T1和M1同时挂掉也不会丢失session会话,避免单点故障。(nginx
负载到T1,T1数据一份在内存上,一份存在M2上,当T1挂掉后,T2在M2上获得T1数据并将新数据加上之前数据都存在M2上;当左边整个节点挂掉,T2依旧可以从M2获取T1数据,而T2的数据T2内存有一份,后续将T2数据都存到M2)
实验:server1上打开nginx
server2上交叉存储
将上面调用的java的类放在tomcat/lib底下
将调用的java类文件发送到server3tomcat/lib下
安装memcache: yum install memcached -y,启动查看发现11211端口
server3上和server2相同操作:
启动查看发现11211端口 因为配置过tomcat文件,所以重启tomcat,查看日志,配置生效:
server3相同操作:
浏览器输入数据实验:
下面实验n2的ID:CE1FFC036621768ADD0DF5C5CB19B9E2-n2
下面ID不一样是因为实验了多次,截屏乱了,但不影响实验判断
(1)server3 -> n1 ,数据在n1里面(user1、2、3)
(2)server3上停掉tomcat:/usr/local/tomcat/bin/shutdown.sh
输入user4、5 , 变为server2 -> n1 ,数据在n1里面(user1、2、3、4、5)
(3) 停掉server2上的memcache n1时:[root@server2 tomcat]# systemctl stop memcached
输入user6、7变为server2 -> n2,使用工具telnet来查看我们缓存的信息:telnet 172.25.254.3 11211输入n2ID发现所有数据(user1到7)存在在n2上。
(4)打开server3的tomcat关掉server2的tomcat:输入user8 变为server3 -> n2
所有信息在n2上。
(5)上面server3 -> n2不是交叉存储,打开server2上的mem服务(打开n1),关掉server3上的mem(关掉n2),输入user9变为server3 -> n1交叉存储,数据user1......9存在n1上实现交叉存储
[root@server2 tomcat]# /usr/local/tomcat/bin/startup.sh
[root@server3 tomcat]# /usr/local/tomcat/bin/shutdown.sh
上述无论是tomcat挂掉还是memcache关闭,或者是某个后端服务器(server2或server3)挂掉都不影响session信息的保存。(注:如果某个后端服务器挂掉(例如server2),数据就只存在server3上的memcache上,重新开启服务器server2后,要手动切换到交叉存储,不然如果server2服务器再挂掉,数据就丢失了)