Tomcat 集群会话一致性实现css
第1章 Tomcat概述html
1.1 Tomcat 概述前端
Tomcat官方网站:http://tomcat.apache.org/java
Tomcat 是Apache软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun和其余一些公司及我的共同开发而成。因为有了Sun的参与和支持,最新的Servlet和JSP规范老是能在Tomcat中获得体现,Tomcat 5 支持最新的Servlet 2.4和JSP 2.0规范。由于Tomcat技术先进、性能稳定,并且免费,于是深受 Java 爱好者的喜好并获得了部分软件开发商的承认,成为目前比较流行的Web应用服务器。目前互联网的主流开发语言仍然是JAVA和PHP。固然Python发展势头很猛。node
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是不少的场合下被广泛使用,是开发和调试JSP程序的首选。Tomcat和 IIS 等Web服务器同样,具备处理 HTML 页面的功能。不过,Tomcat处理静态HTML的能力不如 Apache服务器。linux
1.2 Tomcat的特色nginx
1. Tomcat运行时占用的系统资源小,扩展性好,支持负载均衡与邮件服务等开发应用系统经常使用的功能;web
2. Tomcat是一个开源的web服务器 ;redis
3. Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是不少的场合下被广泛使用,是开发和调试JSP程序的首选。数据库
4. 对于一个初学者来讲,能够这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,因此当你运行tomcat时,它实际上做为一个Apache独立的进程单独运行的。 当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器同样,具备处理HTML页面的功能,另外它仍是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。
5. Tomcat处理静态HTML的能力不如Apache服务器。
1.3 Tomcat 重要目录说明
/bin: - Tomcat 脚本存放目录(如启动、关闭脚本)。
.sh:文件用于 Unix 系统; .bat 文件用于 Windows 系统
/conf: Tomcat 配置文件目录
/logs: Tomcat 默认日志目录。
./logs/catalina.out:Tomcat实时日志文件。
Tomcat启动成功后会在改文件写入以下信息:能够用于判断tomcat是否启动成功
org.apache.catalina.startup.Catalina.start Server startup in 606 ms
/webapps: webapp 运行的目录。
/work: 工做目录,用以产生有JSP编译出的Servlet的.java和.class文件。
/temp: 临时目录。
1.4 Tomcat下Session一致性的实现方案
1) 请求精肯定位
session sticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登陆信息,若是宕机,则等同于单点部署,会丢失,会话不复制。
2) session复制共享
session replication,如tomcat自带session共享,主要是指集群环境下,多台应用服务器之间同步session,使session保持一致,对外透明。 若是其中一台服务器发生故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,因为session已同步,故能保证用户的session信息不会丢失,会话复制,。
此方案的不足之处:
a. 必须在同一种中间件之间完成(如:tomcat-tomcat之间)。
b. session复制带来的性能损失会快速增长.特别是当session中保存了较大的对象,并且对象变化较快时, 性能降低更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。
c. Session内容经过广播同步给成员,会形成网络流量瓶颈,即使是内网瓶颈。
在大并发下表现并很差。
3) 基于cache DB缓存的session共享
基于memcache/redis缓存的session共享.即便用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,若是找到则复制到本机,这样实现session共享和高可用。
1.5 Tomcat集群session同步方案有如下几种方式
1)使用tomcat自带的cluster方式
多个tomcat间自动实时复制session信息,配置起来很简单。但这个方案的效率比较低,在大并发下表现并很差。
2)利用nginx的基于访问ip的hash路由策略
保证访问的ip始终被路由到同一个tomcat上,这个配置更简单。每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session(并非共享session解决)的问题! 而且若是应用是某一个局域网大量用户同时登陆,但这种方式可能会致使负载不那么均衡。
3)利用nginx插件实现tomcat集群和session同步
nginx-upstream-jvm-route是一个Nginx的扩展模块,用来实现基于Cookie的Session Sticky的功能。可是遗憾的是,这个模块的补丁在nginx1.4版本以后就没有再更新了,因此nginx1.4以后版本跟该模块就不兼容了!!
4)利用memcached实现(MSM工具)
memcached存储session,并把多个tomcat的session集中管理,前端再利用nginx负载均衡和动静态资源分离,在兼顾系统水平扩展的同时又能保证较高的性能。即经过MSM工具把Tomcat的Session序列化后保存到Memcached里面,从而实现Session共享。
5)利用redis实现
使用redis不只仅能够将缓存的session持久化,还由于它支持的单个对象比较大,并且数据类型丰富,不仅是缓存 session,还能够作其余用途,能够一举几得。Redis这种方式目前还不支持Tomcat8环境(如今网上插件不支持tomcat8,非要支持tomcat8,则需修改插件jar包的源代码!)
6)利用filter方法实现
这种方法比较推荐,由于它的服务器使用范围比较多,不只限于tomcat ,并且实现的原理比较简单容易控制。
7)利用terracotta服务器共享session
这种方式配置比较复杂。
在Tomcat集群中,当一个节点出现故障,虽然有高可用集群来负责故障转移,但用户的session信息如何保持呢?
下面介绍第4种方案,session复制同步使用MSM(Memcache-Session-Manager),即利用MSM+Memcached作Session共享。
1.6 MSM(Memcached-Session-Manager)的介绍
1.6.1 MSM介绍
详细介绍能够参考博文:http://www.javashuo.com/article/p-zxhcwtlb-nr.html
MSM是一个高可用的Tomcat Session共享解决方案,除了能够从本机内存快速读取Session信息(仅针对黏性Session)外,还可以使用Memcached存取Session,以实现高可用。
传统tomcat集群,会话复制随着结点数增多,扩展性成为瓶颈。MSM使用memcached完成统一管理tomcat会话,避免tomcat结点间过多会话复制。
MSM利用Value(Tomcat 阀)对Request进行跟踪。Request请求到来时,从memcached加载session,Request请求结束时,将tomcat session更新至memcached,以达到session共享之目的, 支持sticky和non-sticky模式:
sticky : 会话粘连模式(黏性session)。客户端在一台tomcat实例上完成登陆后,之后的请求均会根据IP直接绑定到该tomcat实例。
no-sticky:会话非粘连模式(非粘性session)。客户端的请求是随机分发,多台tomcat实例均会收到请求。
1.6.2 cookie和session
在进行环境部署以前,要对cookie和session的工做机制很是了解,若是不了解其中的原理且只是机械性地去按照参考文档部署,那么这是毫无心义的。
1)cookie是怎么工做的?
加入咱们建立了一个名字为login的Cookie来包含访问者的信息,建立Cookie时,服务器端的Header以下面所示,这里假设访问者的注册名是“xiaoruan”,同时还对所建立的Cookie的属性如path、domain、expires等进行了指定。
1. Set-Cookie:login=xiaoruan;path=/;domain=xruan.com;
2. expires=Monday,01-Mar-99 00:00:01 GMT
提示:
1. 上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”的Cookie赋值为“wangshibo”。
注意,在实际传递过程当中这个Cookie的值是通过了URLEncode方法的URL编码操做的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器将Cookie经过请求以忽略路径的方式返回到服务器,完成浏览器的认证操做。
2. 此外,咱们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性可以在浏览器端对Cookie发送进行限定,具体到上面的例子,该Cookie只能传到指定的服务器上,而决不会跑到其余的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上只保存到1999年3月1日1秒。 固然,若是浏览器上Cookie太多,超过了系统所容许的范围,浏览器将自动对它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪个目录路径下。
说明:浏览器建立了一个Cookie后,对于每个针对该网站的请求,都会在Header中带着这个Cookie;不过,对于其余网站的请求Cookie是绝对不会跟着发送的。并且浏览器会这样一直发送,直到Cookie过时为止。
2)session是如何工做的?
因为http是无状态的协议,你访问了页面A,而后再访问B页面,http没法肯定这2个访问来自一我的,所以要用cookie或session来跟踪用户,根据受权和用户身份来 显示不一样的页面。好比用户A登录了,那么能看到本身的我的信息,而B没登录,没法看到我的信息。还有A可能在购物,把商品放入购物车,此时B也有这个过程, 你没法肯定A,B的身份和购物信息,因此须要一个session ID来维持这个过程。
cookie是服务器发给客户端并保持在客户端的一个文件,里面包含了用户的访问信息(帐户密码等),能够手动删除或设置有效期,在下次访问的时候,会返给服务器。
注意:cookie能够被禁用,因此要想其余办法,这就是session。cookie数据存放在客户的浏览器上,session数据放在服务器上。cookie同时也是session id的载体,cookie保存session id。另外:cookie不是很安全,别人能够分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。session是服务器端缓存,cookie是客户端缓存。因此建议:将登录信息等重要信息存放为session;其余信息若是须要保留,能够放在cookie中。
好比:你去商场购物,商场会给你办一张会员卡,下次你来出示该卡,会有打折优惠,该卡能够本身保存(cookie),或是商场代为保管,因为会员太多,我的须要保存卡号信息(session ID)。
3)为何要持久化session(共享session)?
缘由是在客户端每一个用户的Session对象存在Servlet容器中,若是Tomcat服务器重启或者宕机的话,那么该session就会丢失,而客户端的操做会因为session丢失而形成数据丢失;若是当前用户访问量巨大,每一个用户的Session里存放大量数据的话,那么就很占用服务器大量的内存,进而导致服务器性能受到影响。
可使用数据库持久化session,分为物理数据库和内存数据库。物理数据库备份session,因为其性能缘由,不推荐;内存数据库可使用redis和memcached,这里介绍memcached的方法。
1.6.3 MSM工做原理
1)Sticky Session(黏性) 模式下的工做原理:
Tomcat本地Session为主Session,Memcached 中的Session为备Session。Request请求到来时, 从memcached加载备 Session到 tomcat (仅当tomcat jvmroute发生变化时, 不然直接取Tomcat Session);Request请求结束时,将Tomcat Session更新至memcached,以达到主备同步之目的。 安装在Tomcat上的MSM使用本机内存保存Session,当一个请求执行完毕以后,若是对应的Session在本地不存在(即某用户的第一次请求),则将该Session复制一份至Memcached;当该Session的下一个请求到达时,会使用Tomcat的本地Session,请求处理结束以后,Session的变化会同步更新到 Memcached,保证数据一致。当集群中的一个Tomcat挂掉,下一次请求会被路由到其余Tomcat上。负责处理此此请求的Tomcat并不清楚Session信息,因而从Memcached查找该Session,更新该Session并将其保存至本机。这次请求结束,Session被修改,送回Memcached备份。
2)Non-sticky Session (非黏性)模式下的工做原理(记住:多台tomcat集群或多个tomcat实例时须要选择Non-Sticky模式,即sticky="false"):
Tomcat本地Session为中转Session,Memcached1为主Session,Memcached2为备Session。Request请求到来时,从Memcached2加载备Session到tomcat,(当容器中仍是没有Session 则从Memcached1加载主Session到tomcat,这种状况是只有一个memcached节点,或者有Memcached1 出错时),Request请求结束时,将Tomcat Session更新至主Memcached1和备memcached2,而且清除Tomcat Session 。以达到主备同步之目的。 多台tomcat集群时 须要选择Non-Sticky模式,即sticky="false"。
第2章 搭建过程
Tomcat 集群所须要的软件包能够访问个人分享获取:
连接:https://pan.baidu.com/s/1HzgOCNRbE7Ol8IJIMA-hHw
提取码:jziw
2.1 环境说明
操做系统: Cent OS 7.6,内核版本:3.10.0-957.el7.x86_64
Tomcat: tomcat-8.5.42
Memcached: memcached.x86_64-1.4.15-10.el7_3.1
主机规划:
主机名 |
安装软件 |
IP地址 |
角色 |
nginx-distributor |
nginx-1.16.1-1 |
192.168.0.11 |
调度器 |
tomcat01 |
apache-tomcat-8.5.42 |
192.168.0.12 |
Tomcat Server |
tomcat02 |
apache-tomcat-8.5.42 |
192.168.0.13 |
Tomcat Server |
memcached01 |
memcached-1.4.15-10 |
192.168.0.14 |
Memcached缓存服务器 |
memcached02 |
memcached-1.4.15-10 |
192.168.0.15 |
Memcached缓存服务器 |
Tomcat集群会话一致性原理图:
2.2 部署Tomcat集群
2.2.1 安装配置Nginx调度器
第1步:安装nginx
直接使用yum安装:
yum install -y nginx
提示:用yum安装nginx须要epel源。
第2步:Nginx调度器最简单配置
修改前先备份,好习惯:
cp /etc/nginx/nginx.conf{,.bak}
清空原来的配置文件:
> /etc/nginx/nginx.conf
加入如下内容:
user nginx; worker_processes 6; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 15000; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 30; types_hash_max_size 2048; include /etc/nginx/conf.d/*.conf; upstream tomcat { server 192.168.0.12:8080 weight=20; server 192.168.0.13:8080 weight=20; } server { include /etc/nginx/default.d/*.conf; location ~\.jsp$ { proxy_pass http://tomcat; include proxy_params; } } }
第3步:启动nginx
systemctl start nginx
说明:使用rpm包就是方便。
2.2.2 安装配置Tomcat
第1步:下载Tomcat集群所需软件包
Tomcat:
到Tomcat官方网站下载二进制包:
https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
JDK:
最新版:https://www.oracle.com/technetwork/java/javase/downloads/index.html
归档版本:https://www.oracle.com/technetwork/java/javase/archive-139210.html
下载的软件包放到/root/softwares/目录:
[root@tomcat01 ~]# ll softwares/
第2步:安装配置JDK
注意:若是系统中安装了openjdk,必须先卸载:
yum -y remove java-*
开始安装配置JDK:
cd /root/softwares tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/ cat > /etc/profile.d/jdk.sh << EOF #JDK Config JAVA_HOME=/usr/local/jdk1.8.0_191 PATH=\$JAVA_HOME/bin:\$PATH CLASSPATH=\$JAVA_HOME/jre/lib/ext:\$JAVA_HOME/lib/tools.jar export PATH JAVA_HOME CLASSPATH EOF source /etc/profile.d/jdk.sh
第3步:安装Tomcat(在两台Tomcat Server上操做)
cd /root/softwares tar xf apache-tomcat-8.5.42.tar.gz -C /usr/local/src cd /usr/local/src/ mv apache-tomcat-8.5.42 ../tomcat echo "export CATALINA_HOME=/usr/local/tomcat" > /etc/profile.d/tomcat.sh source /etc/profile.d/tomcat.sh
注意:Tomcat有两种安装方式,一种是直接解压就可使用的二进制文件,第二种是编译安装,我这里采用了第一种方法,下载的Tomcat软件直接解压就能够执行的二进制文件,由于在官方默认下载的即是使用第一种方法安装,解压后的目录以下:
第4步:配置Tomcat启动脚本并启动tomcat(在两台Tomcat Server上操做)
cat > /etc/init.d/tomcat << EOF #!/bin/bash # # tomcat startup script for the Tomcat server # # chkconfig: 345 80 20 # description: start the tomcat deamon # # Source function library JAVA_HOME=/usr/local/jdk1.8.0_191 export JAVA_HOME CATALINA_HOME=/usr/local/tomcat export CATALINA_HOME case "\$1" in start) echo "Starting Tomcat..." \$CATALINA_HOME/bin/startup.sh ;; stop) echo "Stopping Tomcat..." \$CATALINA_HOME/bin/shutdown.sh ;; restart) echo "Stopping Tomcat..." \$CATALINA_HOME/bin/shutdown.sh sleep 2 echo echo "Starting Tomcat..." \$CATALINA_HOME/bin/startup.sh ;; *) echo "Usage: \$prog {start|stop|restart}" ;; esac exit 0 EOF chmod +x /etc/init.d/tomcat chkconfig --add tomcat chkconfig --level 345 tomcat on service tomcat start
查看tomcat状态:
[root@tomcat01 ~]# lsof -i :8080
第5步:测试Tomcat
命令行测试:
[root@tomcat02 ~]# curl -I 192.168.0.12:8080 HTTP/1.1 200 Accept-Ranges: bytes ETag: W/"14-1591538432000" Last-Modified: Sun, 07 Jun 2020 14:00:32 GMT Content-Type: text/html Content-Length: 14 Date: Sun, 14 Jun 2020 10:14:59 GMT
说明:Tomcat Server运行没有问题。
第6步:配置Tomcat(在两台Tomcat Server上操做)
修改server.xml文件:根据你的实际环境修改便可
128 <Engine name="Catalina" defaultHost="bbs.xruan.com"> ………………………………………………………………………………… 148 <Host name="bbs.xruan.com" appBase="/var/www/html/" 149 unpackWARs="true" autoDeploy="true"> 150 <Context path="" docBase="/var/www/html/tomcat/" /> 151 152 <!-- SingleSignOn valve, share authentication between web applications 153 Documentation at: /docs/config/valve.html --> 154 <!-- 155 <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 156 --> 157 158 <!-- Access log processes all example. 159 Documentation at: /docs/config/valve.html 160 Note: The pattern used is equivalent to using pattern="common" --> 161 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/tomcat/" 162 prefix="bbs.xruan.com_access" suffix=".log" 163 pattern="%h %l %u %t "%r" %s %b" /> 164 165 </Host>
修改完后重启tomcat:
service tomcat restart
创建测试页面:
tomcat01:
创建站点目录:
mkdir -p /var/www/html/tomcat
建立测试页面:
vim /var/www/html/tomcat/index.jsp
加入如下内容:
<html> <body bgcolor="blue"> <center> <h1>Session ID: <%out.print(request.getSession().getId()) ;%></h1> <h1>192.168.10.12</h1> <h1>port:8080</h1> <h1>Tomcat-Server-1</h1> </body> </html>
tomcat02:
创建站点目录:
mkdir -p /var/www/html/tomcat
建立测试页面:
vim /var/www/html/tomcat/index.jsp
加入如下内容:
<html> <body bgcolor="yellow"> <center> <h1>Session ID: <%out.print(request.getSession().getId()) ;%></h1> <h1>192.168.10.13</h1> <h1>port:8080</h1> <h1>Tomcat-Server-2</h1> </body> </html>
第7步:在浏览器测试
经过nginx调度器访问:http://192.168.0.11/index.jsp
刷新:
说明:不断刷新的话,能够看见会话号(Session ID)会不断变化。
2.2.3 安装配置Memcached
第1步:安装memcached(在memcached01和memcached02上操做)
yum install -y memcached
第2步:修改memcached监听(在memcached01和memcached02上操做)
修改前先备份:
cp /etc/sysconfig/memcached{,.bak}
memcached01:
vim /etc/sysconfig/memcached
按以下内容修改:OPTIONS部分
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 192.168.0.14"
memcached02:
vim /etc/sysconfig/memcached
按以下内容修改:红色字部分
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 192.168.0.15"
说明:
1. 参数“-l IP”表示指定memcached的监听地址。
2. 参数“-l” 中的“l”是小写字母“l”,不是数字“1”。
第3步:启动memcached(在memcached01和memcached02上操做)
systemctl start memcached
查看:
memcached01:
[root@memcached01 ~]# netstat -tunpl | grep memcached
memcached02:
[root@memcached02 ~]# netstat -tunpl | grep memcached
第4步:修改Tomcat配置(在两台Tomcat Server上操做)
修改前先备份:
/usr/local/tomcat/conf/context.xml{,.bak}
修改context.xml文件:<Manager ......../>段
<Context> <!-- Default set of monitored resources. If one of these changes, the --> <!-- web application will be reloaded. --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.0.14:11211,n2:192.168.0.15:11211" failoverNodes="n2" sticky="false" sessionBackupAsync="false" lockingMode="auto" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> </Context>
保存后从新启动tomcat:
service tomcat start
第5步:把MSM相关的JAR包拷贝到tomcat的lib目录下
cp /root/softwares/msm-jar/* /usr/local/tomcat/lib/
第6步:在浏览器中测试
地址栏输入:http://192.168.0.1/index.jsp
刷新:
注意:访问的是nginx调度器的地址。
如今会话号(Session ID)保持不变。
第3章 遇到的错误
1)配置tomcat中配置memcached后启动失败
tail -f catalina.out日志报以下错误:
10-Jun-2020 22:56:55.568 INFO [bbs.xruan.com-startStop-1] de.javakaffee.web.msm.MemcachedSessionService.startInternal MemcachedSessionService starts initialization... (configured nodes definition n1:192.168.0.14:11211,n2:192.168.0.15:11211, failover nodes n2) 10-Jun-2020 22:56:55.570 SEVERE [bbs.xruan.com-startStop-1] org.apache.catalina.core.StandardContext.startInternal The session manager failed to start org.apache.catalina.LifecycleException: Failed to start component [de.javakaffee.web.msm.MemcachedBackupSessionManager[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5253) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.AbstractMethodError: de.javakaffee.web.msm.MemcachedBackupSessionManager.getContainer()Lorg/apache/catalina/Container; at de.javakaffee.web.msm.MemcachedSessionService.createMemcachedNodesManager(MemcachedSessionService.java:477) at de.javakaffee.web.msm.MemcachedSessionService.startInternal(MemcachedSessionService.java:423) at de.javakaffee.web.msm.MemcachedBackupSessionManager.startInternal(MemcachedBackupSessionManager.java:505) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 8 more 10-Jun-2020 22:56:55.571 SEVERE [bbs.xruan.com-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors 10-Jun-2020 22:56:55.580 INFO [bbs.xruan.com-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web applicationdirectory [/var/www/html/tomcat]
访问页面也有错误:
Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
缘由:msm所需的软件包版本问题致使的。
解决:更换msm软件包。
本文部份内容参考自: