在linux下部署的時候,爲了方便,直接從其他項目拷貝的tomcat過來,導致了一些比較奇怪的問題,浪費了不少時間,寫個記錄便於以後查看。
1.將war包放入linux服務器的tomcat/webapps目錄下
使用idea的Maven插件將項目打包成war包之後(在打成war包之前請重新編譯一遍),放到linux服務器的tomcat/webapps下,不用解壓縮,原因後續解釋,同時刪掉webapps下其他無關文件,以免啓動時相互影響。
2.刪掉tomcat/work下的所有文件
如果tomcat是從其他項目拷貝過來的,一定要刪掉下面的文件,防止奇怪的問題產生。應用啓動之後,work下面會有該應用的所有文件。
3.修改tomcat/conf/server.xml
修改監聽端口號,http訪問端口號,以及其他訪問http訪問端口號,Context路徑設置
監聽端口號修改如下:
<Server port="8077" shutdown="SHUTDOWN">
http訪問端口號修改如下 :
<Service name="Catalina">
<Connector port="7701" protocol="HTTP/1.1"
maxThreads="1000"
minProcessors="100"
maxProcessors="1000"
minSpareThreads="100"
maxSpareThreads="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
connectionTimeout="20000"
disableUploadTimeout="true"
redirectPort="8443"/>
</Service>
其他http訪問端口修改如下:
<Connector port="8078" protocol="AJP/1.3" redirectPort="8443"/>
修改訪問路徑以及sessionId設置:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/web" docBase="web" reloadable="true" sessionCookieName="web1"/>
</Host>
appBase="webapps":配置的webapps對應tomcat/webapps目錄;
unpackWARs="true":表示之前放在tomcat/webapps下的war包不用解壓,startup.sh啓動時啓動解壓
autoDeploy="true":表示tomcat檢測到webapps下的web應用更新時,自動發佈
path="/web":表示項目訪問路徑,即http://localhost:7701/web
docBase="web":假設項目war包爲web.war包,則這個地方配置的web即爲web.war解壓縮後的tomcat/webapps/web文件夾
sessionCookieName="web1":手動設置該應用的sessionCookie名稱爲web1,當同一個linux服務器上兩個不同的tomcat部署了相同的應用,即使端口號不一樣,即同一個linux部署了http://localhost:7701/web,http://localhost:7702/web兩個一樣的應用,此時如果不設置sessionCookie的名稱,就會導致兩個應用的session相互佔用,出現異常。因爲cookie將同一ip識別爲同一域。
4.編寫更新腳本update.sh
#此處爲Linux下的sh腳本
#!/bin/sh
#將上一版本的war包備份到backup文件夾下,-f表示如果原目錄下有該文件,直接覆蓋掉該文件
#cp -f /home/model/web/tomcat/webapps/web.war /home/model/web/backup
#替換webapps下的war包
#停止應用 有時進程使用shutdown.sh停不掉,可以使用Linux命令(lsof -i:端口號,此處爲lsof -i:7701)先查看該應用佔用的進程pid,然後使用(kill -9 pid)殺掉進程,
sh /home/model/web/tomcat/bin/shutdown.sh
#啓動應用
sh /home/model/web/tomcat/bin/startup.sh
#查看日誌
tail -f /home/model/web/tomcat/logs/catalina.out
5.遇到的問題
1)Linux下sh文件無執行權限
使用Linux命令:chmod +x "*.sh" 爲當前用戶增加所有sh文件的可執行權限
chmod:修改文件的權限
+:表示增加權限,-表示移除權限
x:如果對象是目錄或者它已有執行權限,賦予執行權限
2)slf4j-log4j12-1.7.5.jar與logback-classic-1.1.2.jar衝突
當前web項目使用的日誌包爲logback-classic-1.1.2.jar,而該項目引用的demo1包中使用了slf4j-log4j12-1.7.5.jar包,兩者必須共存,還不能修改任何代碼。()
首先應該定位衝突的jar包類型,然後確定該web應用使用logback-classic-1.1.2.jar的jar包,想要demo1包依賴的slf4j-log4j12-1.7.5.jar不報錯,需要找到是哪個jar包引用了slf4j的包,可以通過IDEA中web項目的Maven Project的依賴樹,或者使用快捷鍵Ctrl+Alt+Shift+U(如果你沒改快捷鍵的話),查看是哪個jar包進行了引用,然後在pom.xml文件中該jar包下添加exclusions,如下:
<dependency>
<groupId>com.web.demo</groupId>
<artifactId>demo1</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
exclusions:表示排除依賴,web包排除對slf4j包的依賴,demo1包中pom文件的內容不變。這樣web包的logback-classic-1.1.2.jar與slf4j-log4j12-1.7.5.jar就不會發生衝突了。
dependency:可選依賴。
順便普及一下Maven依賴的兩個原則:路徑最短優先,第一聲明優先。
3)使用shutdown.sh時,應用的一些線程殺不掉
除了使用lsof -i:7701 ,kill -9 pid能殺掉一些進程外,還出現了The web application [web] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@56848cd7]) and a value of type[io.netty.util.internal.InternalThreadLocalMap](value[io.netty.util.internal.InternalThreadLocalMap@64ba5cdf]) but failed to remove it when the web application was stopped.Threads are going to be renewed over time to try and avoid a probable memory leak.
網上查了不少解決方案,看的一知半解,最後刪掉tomcat/webapps下除web應用的所有文件,以及work下的所有文件,然後殺掉所有的進程,重新啓動就好了。
4)在使用update.sh腳本更新時,有一些進程可能殺不掉,在使用之後,建議檢查一下應用是否啓動正常
5)大部分問題是因爲我直接使用了其他項目的tomcat,收到之前項目的配置或者文件影響,建議在linux部署時直接使用全新的安裝包進行部署。