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 [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部署時直接使用全新的安裝包進行部署。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章