認識Tomcat核心元件及其啟動引數

搬磚大叔發表於2018-12-15

認識Tomcat及其核心元件

  Tomcat是一個java的web容器,Tomcat是實現了javaEE當中的Servlet和JSP規範的一個容器。Tomcat一般用於動態請求的處理(Servlet)。Tomcat採用元件的方式去設計(面向元件)。整體的功能是通過元件的方式去拼裝的。並且每一個元件都可以進行替換保證了它的一個靈活性。看到下圖:

Tomcat
  Server 和 Service元件: Tomcat的一個伺服器(Server)和Tomcat的服務(Service Tomcat-standalone),主要作用是將聯結器(Connector)和引擎(Engine)關聯;

  聯結器(Connector): 聯結器幫助我們把客戶端裡面的請求連線到我們Tomcat的服務。Tomcat可以配置多個聯結器。在這個聯結器中可以指定Service和外部通訊的一個協議(HTTP 1.1、HTTPS、AJP: apache 私有協議,用於apache 反向代理Tomcat)。

  容器元件(Container ): 容器元件包含引擎(Engine,預設的引擎叫catalina)、虛擬機器(Host)、Context。

  Engine主要的作用是將協議解析並轉換成request傳給虛擬機器。

  虛擬機器(Host) 基於域名分發請求(可以配置多個虛擬機器)。

  Context隔離每個WEB應用,每一個Context的ClassLoader都是獨立的(Tomcat的webapps目錄下有一個ROOT資料夾代表的是根路徑)。

  Tomcat還有一些其它元件,像logger日誌管理器、loader載入器、pipeline管道等。這些元件都是內嵌的元件。

元件之間的組成關係

  我們知道Tomcat裡面有哪些元件了,那這些元件的組成關係怎樣呢?看下圖:

Tomcat元件之間的組成關係
  最頂層的是Server,然後是ServiceService可以有多個,一般情況下只配置一個),一個Service裡面可以支援多個Connector,一個Service裡面只能由唯一的一個EngineEngine裡面可以包含多個HostHost可以包含多個Context

Tomcat啟動引數的說明

Tomcat的主要啟動引數

  1、JAVA_OPTS: jvm 啟動引數 , 設定記憶體 編碼等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8;

  2、JAVA_HOME: 指定jdk 目錄,如果未設定從java 環境變數當中去找;

  3、CATALINA_HOME: Tomcat 程式的根目錄;

  4、CATALINA_BASE: 應用部署目錄,預設為CATALINA_HOME;

  5、CATALINA_OUT: 應用日誌輸出目錄,預設為CATALINA_BASE;

  6、CATALINA_TMPDIR: 應用臨時目錄,預設為CATALINA_BASE/temp。

平時啟動Tomcat的過程

  1、複製WAR包到Tomcat的webapps資料夾下;

  2、執行starup.bat(startup.sh)指令碼啟動;

  3、在啟動過程中會自動將war包解壓裝載。

  但是在我們平時開發的時候是直接在Eclipse或IDEA中啟動WEB專案的,不會把將專案打包,然後將war包複製到Tomcat的webapps目錄下再執行starup.bat(startup.sh)指令碼的。

  我們在Eclipse或IDEA中啟動WEB專案的時候其實是在Tomcat程式檔案之外建立了一個部署目錄,在一般的生產環境中也是這麼做的 即:Tomcat程式目錄和部署目錄分開 。我們在只需要在啟動時指定CATALINA_HOMECATALINA_BASE 引數即可實現。

演示Tomcat程式目錄和部署目錄分開

  1、下載並解壓Tomcat

  2、建立apps目錄,在apps下建立test-web,test-web下新建一個logs目錄。

  3、將Tomcat目錄下的conf和webapps兩個目錄拷貝一份到test-web。

  4、建立並編寫指令碼:tomcat.sh

#!/bin/bash 
#####設定jvm記憶體,最小記憶體和最大記憶體
export JAVA_OPTS="-Xms100m -Xmx200m"	
#####指定JDK目錄
export JAVA_HOME=/usr/local/java
#####對應的Tomcat的目錄
export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34
##### pwd:當前指令碼所在目錄
export CATALINA_BASE="`pwd`"
##### 接收一個引數,這個引數包含start、stop、restart、version和configtest
##### start:執行catalina.sh指令碼
##### stop:關閉catalina.sh指令碼
##### restart:重啟catalina.sh指令碼
##### version:檢視版本號
##### configtest:檢視配置是否正確
case $1 in
        start)
        $CATALINA_HOME/bin/catalina.sh start
                echo start success!!
        ;;
        stop)
                $CATALINA_HOME/bin/catalina.sh stop
                echo stop success!!
        ;;
        restart)
        $CATALINA_HOME/bin/catalina.sh stop
                echo stop success!!
                sleep 2
        $CATALINA_HOME/bin/catalina.sh start
        echo start success!!
        ;;
        version)
        $CATALINA_HOME/bin/catalina.sh version
        ;;
        configtest)
        $CATALINA_HOME/bin/catalina.sh configtest
        ;;
        esac
exit 0
複製程式碼

  5、在test-web目錄下執行./tomcat.sh start命令啟動Tomcat,列印出的日誌最後一行為start success!!即啟動成功

  6、執行curl 127.0.0.1:8080,日誌列印出webapps/ROOT/index.jsp檔案的內容則訪問成功。

  這樣就可以將應用程式和Tomcat的部署目錄進行分離。那這樣有什麼好處呢?看下圖:

Tomcat
  1、看上圖所知:我的Tomcat在A目錄,所有的應用在B目錄,B目錄中的所有的應用是指向Tomcat的,當Tomcat要進行升級的時候,我只需要把Tomcat所在的A目錄升級了就可以了,而不需要一點一點的去升級所有的配置了。

  2、我在每一個應用程式內新建了一個logs資料夾,我們的日誌檔案是獨立的不會和其它專案混淆在一起。

  3、我們的配置檔案conf也是獨立的。各應用之間互不影響,靈活性高。

相關文章