1. 程式人生 > >linux下tomcat部署注意點

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開頭的日誌)對比檢視,瞭解更詳細的報錯資訊。