linux下tomcat部署注意點
在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 [[email protected]]) and a value of type[io.netty.util.internal.InternalThreadLocalMap](value[[email protected]]) 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部署時直接使用全新的安裝包進行部署。
6)tomcat檢視日誌建議將tomcat/logs/catalina.out與tomcat/logs/localhost*.log(localhost開頭的日誌)對比檢視,瞭解更詳細的報錯資訊。