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軟件包。
本文部份內容參考自: