認識Tomcat及其核心元件
Tomcat是一個java的web容器,Tomcat是實現了javaEE當中的Servlet和JSP規範的一個容器。Tomcat一般用於動態請求的處理(Servlet)。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裡面有哪些元件了,那這些元件的組成關係怎樣呢?看下圖:
最頂層的是Server,然後是Service(Service可以有多個,一般情況下只配置一個),一個Service裡面可以支援多個Connector,一個Service裡面只能由唯一的一個Engine,Engine裡面可以包含多個Host,Host可以包含多個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_HOME 與 CATALINA_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的部署目錄進行分離。那這樣有什麼好處呢?看下圖:
1、看上圖所知:我的Tomcat在A目錄,所有的應用在B目錄,B目錄中的所有的應用是指向Tomcat的,當Tomcat要進行升級的時候,我只需要把Tomcat所在的A目錄升級了就可以了,而不需要一點一點的去升級所有的配置了。2、我在每一個應用程式內新建了一個logs資料夾,我們的日誌檔案是獨立的不會和其它專案混淆在一起。
3、我們的配置檔案conf也是獨立的。各應用之間互不影響,靈活性高。