一、Tomcat 架構概覽

1、Tomcat是什么?
Apache Tomcat軟件是Jakarta Servlet、 Jakarta Server Pages、 Jakarta Expression Language、 Jakarta WebSocket、 Jakarta Annotations和 Jakarta Authentication 規范的開源實現 。這些規范是 Jakarta EE 平臺的一部分。
tomcat是一個容器,用于承載Servlet,Tomcat就是實現了部分J2EE規范的服務器。
Jakarta EE是J2 EE的延續,其中Tomcat10以后都是Jakarta EE,Tomcat9以前都是都是J2EE。
2、Tomcat文件結構
2.1、目錄和文件
- bin:二進制執行文件,腳本
- conf:配置文件
- logs: 日志文件
- webApps:web應用存放位置
- lib:共享文件
- CATALINA_HOME:安裝根目錄,CATALINA是tomcat核心所在。存放不可變文件,只讀文件,屬于tomcat的共用基礎配置。
- CATALINA_BASE:配置文件的目錄,可以通過改變配置來解決單機運行多個tomcat而不需要解壓。
2.2、啟動類
- 找到tomcat下面bin目錄
- 查看啟動腳本,windows為startup.bat,mac系統為startup.sh,內容不需要過多關注,直接查看最后一句
1.exec "$PRGDIR"/"$EXECUTABLE" start "$@"
2.EXECUTABLE=catalina.sh
- 上述為腳本內容,第一行執行了變量EXECUTABLE中的start,第二行為EXECUTABLE變量具體內容,可以看到具體執行的還是catalina.sh中的start方法。
- 找到catalina.sh腳本中的start
if [ "$1" = "debug" ] ; then
if $os400; then
echo "Debug command not available on OS400"
exit 1
else
shift
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval exec ""$_RUNJDB"" ""$CATALINA_LOGGING_CONFIG"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS"
-D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS"
-classpath "$CLASSPATH"
-sourcepath "$CATALINA_HOME"/../../java
-Djava.security.manager
-Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy
-Dcatalina.base="$CATALINA_BASE"
-Dcatalina.home="$CATALINA_HOME"
-Djava.io.tmpdir="$CATALINA_TMPDIR"
org.apache.catalina.startup.Bootstrap "$@" start
else
eval exec ""$_RUNJDB"" ""$CATALINA_LOGGING_CONFIG"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS"
-D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS"
-classpath "$CLASSPATH"
-sourcepath "$CATALINA_HOME"/../../java
-Dcatalina.base="$CATALINA_BASE"
-Dcatalina.home="$CATALINA_HOME"
-Djava.io.tmpdir="$CATALINA_TMPDIR"
org.apache.catalina.startup.Bootstrap "$@" start
fi
fi
- 這個腳本內容比較多,不必逐行去看,直接找到start相關內容,也就是如上內容,可以看到最終找到了
- org.apache.catalina.startup.Bootstrap
2.3、xml文件
- web.xml:tomcat的web.xml是所有web應用的默認值都取自conf/web.xml,自定義的web.xml是可以覆蓋該默認值。
- context.xml:每個web應用都會加載conf/context.xml
- <Context> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> </Context>
- 一個context代表了一個web應用,web應用的目錄:
- WEB-INF:web的元數據目錄
- META-INF:元數據目錄
- WatchedResource:監聽資源,監聽了WEB-INF/web.xml和${catalina.base}/conf/web.xml,發現改動后,隨即馬上重新加載應用。
2.4、work目錄
jsp最終是要轉變為Servlet,而Servlet是一個java類,類是需要編譯處理的,work目錄就是用來保存jsp生成的Servlet文件
這個目錄就是工作目錄。
2.5、其他目錄
- java:源碼文件目錄
- logs:運行時產生的日志文件
- modules第三方模塊化依賴
- res:資源目錄文件,如:歡迎頁,圖片等
- test:測試包
- webapp:存放項目文件
- 以下文件為tomcat默認自帶的
- docs:文檔頁
- Host-manager:主機管理也
- Manager:總管理頁
- ROOT:root跟頁
3、Tomcat組件
3.1、server組件
server組件定義的是一個tomcat實例
<Server port="8005" shutdown="SHUTDOWN"></Server>
默認監聽在8005端口以接收shutdown命令。
要啟用多個tomcat實例,將它們監聽在不同的端口即可。
這個端口的定義為管理員提供一個關閉實例的便捷途徑,可以直接te.NET至此端口使用SHUTDOWN命令關閉此實例。不過基于安全角度的考慮,通常不允許遠程進行。
3.2、service組件
service組件中封裝connector和container由它們組成一個service向外提供服務
<Service name="Catalina"></Service>
3.3、Connection組件
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
連接器用于接收客戶端發送的請求并返回響應給客戶端。
一個service中可以有多個connector。有多種connector,常見的為http/1.1,http/2和ajp(apache jserv protocol)。在tomcat中,ajp連接協議類型專用于tomcat前端是apache反向代理的情況下。 因此tomcat可以扮演兩種角色:
- Tomcat僅作為應用程序服務器(等價servlet容器,動態jsp;包括servlet和ejb):請求來自于前端的web服務器,這可能是Apache, IIS, Nginx等;
- Tomcat既作為web服務器(解析http協議,響應客戶端,靜態;非處理動態(委托)),也作為應用程序服務器:請求來自于瀏覽器。
3.4、Engline組件
<Engine name="Catalina" defaultHost="localhost">
</Engine>
?
<Engine name="Standalone" defaultHost="localhost" jvmRoute="TomcatA">
</Engine>
engine是service組件中用來分析協議的引擎機器,它從一個或多個connector上接收請求,并將請求交給對應的虛擬主機進行處理,最后返回完整的響應數據給connector,通過connector將響應數據返回給客戶端。
只有一個engine元素必須嵌套在每個service中,且engine必須在其所需要關聯的connector之后
一個service中只允許有一個engine。
3.5、Host組件
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
host容器用來定義虛擬主機。
engine從connector接收到請求進行分析后,會將相關的屬性參數傳遞給對應的(篩選方式是從請求首部的host字段和虛擬主機名稱進行匹配)虛擬host進行處理。
如果沒有合適的虛擬主機,則傳遞給默認虛擬主機。
因此每個容器中必須至少定義一個虛擬主機,且必須有一個虛擬主機和engine容器中定義的默認虛擬主機名稱相同。