面試BAT大廠必知的Tomcat容器
- 2020 年 3 月 26 日
- 筆記
預計閱讀時間: 10分鐘
一、Tomcat各組件
1、認識Tomcat
Tomcat是一個基於JAVA的WEB容器,其實現了JAVA EE中的 Servlet 與 jsp 規範,與Nginx apache 伺服器不同在於一般用於動態請求處理。在架構設計上採用面向組件的方式設計。即整體功能是通過組件的方式拼裝完成。另外每個組件都可以被替換以保證靈活性。

那麼是哪些組件組成了Tomcat呢?
2.Tomcat 各組件及關係
- Server 和 Service
- Connector 連接器
- HTTP 1.1
- SSL https
- AJP( Apache JServ Protocol) apache 私有協議,用於apache 反向代理Tomcat
- Container
- Engine 引擎 catalina
- Host 虛擬機 基於域名 分發請求
- Context 隔離各個WEB應用 每個Context的 ClassLoader都是獨立
- Component
- Manager (管理器)
- logger (日誌管理)
- loader (載入器)
- pipeline (管道)
- valve (管道中的閥)

3.Tomcat啟動參數說明
我們平時啟動Tomcat過程是怎麼樣的?
- 複製WAR包至Tomcat webapp 目錄。
- 執行starut.bat 腳本啟動。
- 啟動過程中war 包會被自動解壓裝載。
但是我們在Eclipse 或idea 中啟動WEB項目的時候 也是把War包複雜至webapps 目錄解壓嗎?顯然不是,其真正做法是在Tomcat程式文件之外創建了一個部署目錄,在一般生產環境中也是這麼做的 即:Tomcat 程式目錄和部署目錄分開 。我們只需要在啟動時指定CATALINA_HOME 與 CATALINA_BASE 參數即可實現。
啟動參數 | 描述說明 |
|---|---|
JAVA_OPTS | jvm 啟動參數 , 設置記憶體 編碼等 -Xms100m -Xmx200m -Dfile.encoding=UTF-8 |
JAVA_HOME | 指定jdk 目錄,如果未設置從java 環境變數當中去找。 |
CATALINA_HOME | Tomcat 程式根目錄 |
CATALINA_BASE | 應用部署目錄,默認為$CATALINA_HOME |
CATALINA_OUT | 應用日誌輸出目錄:默認$CATALINA_BASE/log |
CATALINA_TMPDIR | 應用臨時目錄:默認:$CATALINA_BASE/temp |
可以編寫一個腳本 來實現自定義配置: 演示自定義啟動Tomcat
- 下載並解壓Tomcat
- 創建並拷貝應用目錄
- 創建Tomcat.sh
- 編寫Tomcat.sh
- chmod +x tomcat.sh 添加執行許可權
- 拷貝conf 、webapps 、logs至應用目錄。
- 執行啟動測試。
#!/bin/bash export JAVA_OPTS="-Xms100m -Xmx200m" export JAVA_HOME=/root/svr/jdk/ export CATALINA_HOME=/usr/local/apache-tomcat-8.5.34 export CATALINA_BASE="`pwd`" 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
二、Tomcat server.xml 配置
Server 的基本基本配置:
<Server> <Listener /><!-- 監聽器 --> <GlobaNamingResources> <!-- 全局資源 --> </GlobaNamingResources <Service> <!-- 服務 用於 綁定 連接器與 Engine --> <Connector 8080/> <!-- 連接器--> <Connector 8010 /> <!-- 連接器--> <Connector 8030/> <!-- 連接器--> <Engine> <!-- 執行引擎--> <Logger /> <Realm /> <host "www.tl.com" appBase=""> <!-- 虛擬主機--> <Logger /> <!-- 日誌配置--> <Context "/luban" path=""/> <!-- 上下文配置--> </host> </Engine> </Service> </Server>
元素說明: **server ** root元素:server 的頂級配置 主要屬性: port:執行關閉命令的埠號 shutdown:關閉命令
- 演示shutdown的用法
#基於telent 執行SHUTDOWN 命令即可關閉 telent 127.0.0.1 8005 SHUTDOWN
service 服務:將多個connector 與一個Engine組合成一個服務,可以配置多個服務。
Connector 連接器:用於接收 指定協議下的連接 並指定給唯一的Engine 進行處理。主要屬性:
- protocol 監聽的協議,默認是http/1.1
- port 指定伺服器端要創建的埠號
- minThread 伺服器啟動時創建的處理請求的執行緒數
- maxThread 最大可以創建的處理請求的執行緒數
- enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
- redirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號
- acceptCount 指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理
- connectionTimeout 指定超時的時間數(以毫秒為單位)
- SSLEnabled 是否開啟 sll 驗證,在Https 訪問時需要開啟。
- 演示配置多個Connector
<Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8862" URIEncoding="UTF-8" useBodyEncodingForURI="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript" maxThreads="1024" minSpareThreads="200" acceptCount="800" enableLookups="false" />
Engine 引擎:用於處理連接的執行器,默認的引擎是catalina。一個service 中只能配置一個Engine。主要屬性:name 引擎名稱 defaultHost 默認host
Host 虛擬機:基於域名匹配至指定虛擬機。類似於nginx 當中的server,默認的虛擬機是localhost. 主要屬性:
- 演示配置多個Host
<Host name="www.luban.com" appBase="/usr/www/luban" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.luban.com.access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
Context 應用上下文:一個host 下可以配置多個Context ,每個Context 都有其獨立的classPath。相互隔離,以免造成ClassPath 衝突。主要屬性:
- 演示配置多個Context
<Context docBase="hello" path="/h" reloadable="true"/>
Valve 閥門:可以理解成request 的過濾器,具體配置要基於具體的Valve 介面的子類。以下即為一個訪問日誌的Valve.
End
