目錄結構
目錄 | 說明 |
bin | 服務啟動,停止等相關程序和文件 |
conf | 配置文件 |
lib | 庫目錄 |
logs | 日志記錄 |
webapps | 應用程序,應用部署目錄 |
work | jsp編譯后的結果文件,建議提前預熱訪問 |
/usr/local/apache-tomcat-8.5.100/work/Catalina/localhost/ROOT/org/apache/jsp更新時在這里刪除緩存
配置文件
官方文檔:Apache Tomcat 8 (8.5.100) - Documentation Index
文件名 | 說明 |
server.xml | 主配置文件 |
web.xml | 每個webapp只有“部署”后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認部署相關的配置,每個web應用也可以使用專用配置文件,來覆蓋全局文件 |
context.xml | 用于定義所有web應用均需加載的Context配置,此文件為所有的webapps提供默認配置,每個web應用也可以使用自已專用的配置,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中,覆蓋全局的文件 |
tomcat-users.xml | 用戶認證的賬號和密碼文件 |
catalina.policy | 當使用security選項啟動tomcat時,用于為tomcat設置安全策略 |
catalina.properties | Tomcat 環境變量的配置,用于設定類加載器路徑,以及一些與JVM調優相關參數 |
logging.properties | Tomcat 日志系統相關的配置,可以修改日志級別和日志路徑等 |
日志文件
參考文檔:Logging - Apache Tomcat - Apache Software Foundation
日志格式: Apache Tomcat 9 Configuration Reference (9.0.89) - The Valve Component
參數
%a - 遠程IP地址。另見%{xxx}a,下方有更多說明。
%A - 本地IP地址
%b - 不包括HTTP頭部的發送字節數,如果為零則顯示'-'。
%B - 不包括HTTP頭部的發送字節數。
%D - 處理請求所花費的時間(毫秒)。注意:在httpd中%D表示微秒。Tomcat 10及以后版本將與httpd的行為保持一致。
%F - 提交響應所花費的時間,以毫秒為單位。
%h - 遠程主機名(如果連接器的enableLookups為false,則為IP地址)
%H - 請求協議
%I - 當前請求線程的名稱(可用于后續與堆棧跟蹤比較)
%l - 從identd獲取的遠程邏輯用戶名(始終返回'-')
%m - 請求方法(GET、POST等)
%p - 接收到此請求的本地端口。另見%{xxx}p,下方有更多說明。
%q - 查詢字符串(如果存在,則以'?'開頭)
%r - 請求的第一行(方法和請求URI)
%s - 響應的HTTP狀態碼
%S - 用戶會話ID
%t - 日期和時間,采用通用日志格式
%T - 處理請求所花費的時間,以秒為單位。注意:這個值有毫秒級的精度,而在httpd中是秒級精度。Tomcat 10及以后版本將與httpd的行為對齊。
%u - 經過認證的遠程用戶(如果有的話),否則為'-'(如需可轉義)
%U - 請求的URL路徑
%v - 本地服務器名
%X - 響應完成后連接的狀態:X = 連接在響應完成前被中止。+ = 響應發送后連接可能保持活動。- = 響應發送后連接將關閉。
%{xxx}a - 寫入遠程地址(客戶端)(xxx等于remote時)或連接對等端地址(xxx等于peer時)
%{xxx}i - 寫入名為xxx的傳入頭部的值(如需可轉義)
%{xxx}o - 寫入名為xxx的傳出頭部的值(如需可轉義)
%{xxx}c - 寫入名為xxx的Cookie值(逗號分隔,如需可轉義)
%{xxx}r - 寫入名為xxx的ServletRequest屬性的值(如需可轉義,如果request為null則值為??)
%{xxx}s - 寫入名為xxx的HttpSession屬性的值(如需可轉義,如果request為null則值為??)
%{xxx}p - 寫入本地(服務器)端口(xxx等于local時)或遠程(客戶端)端口(xxx等于remote時)
%{xxx}t - 使用增強的SimpleDateFormat模式xxx格式化請求結束時的時間戳并寫入
?文件
[root@localhost ~]# ls /usr/local/apache-tomcat-8.5.100/logs/ -1
catalina.2024-05-14.log?? tomcat服務日志
catalina.out?????? tomcat服務日志
host-manager.2024-05-14.log? host manager管理日志
localhost.2024-05-14.log????? 默認主機日志
localhost_access_log.2024-05-14.txt????? 默認主機訪問日志
manager.2024-05-14.log???? manager 管理日志
?文件格式
[root@localhost ~]# tail /usr/local/apache-tomcat-8.5.100/conf/server.xml
???????????? Documentation at: /docs/config/valve.html
???????????? Note: The pattern used is equivalent to using pattern="common" -->
??????? <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
?????????????? prefix="localhost_access_log" suffix=".txt"
?????????????? pattern="%h %l %u %t "%r" %s %b" />????? </Host>
??? </Engine>
? </Service>
</Server>
?查看訪問文件
組件
分層和分類
參考:Tomcat的配置文件_tomcat配置文件-CSDN博客
頂級組件
Server,代表整個Tomcat容器,一臺主機可以啟動多tomcat實例,需要確保端口不要產生沖突
服務類組件
Service,實現組織Engine和Connector,建立兩者之間關聯關系, service 里面只能包含一個Engine
className: 用于實現service的類名,一般都org.apache.catalina.core.StandardService。
name:此服務的名稱,默認為Catalina;
連接器組件
Connector,有HTTP(默認端口8080/tcp)、HTTPS(默認端口8443/tcp)、AJP(默認端口
8009/tcp)協議的連接器,AJP(Apache Jserv protocol)是一種基于TCP的二進制通訊協議。
address:指定連接器監聽的地址,默認為所有地址,即0.0.0.0;
maxThreads:支持的最大并發連接數,默認為200;
port:監聽的端口,默認為0;
protocol:連接器使用的協議,默認為HTTP/1.1,定義AJP協議時通常為AJP/1.3;
redirectPort:如果某連接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口;
connectionTimeout:等待客戶端發送請求的超時時間,單位為毫秒,默認為60000,即1分鐘;
enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認為true;
acceptCount:設置等待隊列的最大長度;通常在tomcat所有處理線程均處于繁忙狀態時,新發來的請求將被放置于等待隊列中;
容器類
Engine、Host(虛擬主機)、Context(上下文件,解決路徑映射)都是容器類組件,可以嵌入其它組件,內部配置如何運行應用程序。
Engine:
defaultHost:Tomcat支持基于FQDN的虛擬主機,這些虛擬主機可以通過在Engine容器中定義多個不同的Host組件來實現;但如果此引擎的連接器收到一個發往非非明確定義虛擬主機的請求時則需要將此請求發往一個默認的虛擬主機進行處理,因此,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;
name:Engine組件的名稱,用于日志和錯誤信息記錄時區別不同的引擎
Host:
name : 主機名(FQDN)
appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔后的WAR文件的目錄路徑;可以使用基于$CATALINA_HOME的相對路徑;
autoDeploy:在Tomcat處于運行狀態時放置于appBase目錄中的應用程序文件是否自動進行deploy;默認為true;
unpackWars:在啟用此webapps時是否對WAR格式的歸檔文件先進行展開;默認為true;
Context:
docBase:相應的Web應用程序的存放位置;也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關系,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類的名字;
path:相對于Web服務器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個單獨的xml文件中,此屬性不需要定義;
reloadable:是否允許重新加載此context相關的Web應用程序的類;默認為false
內嵌類
可以內嵌到其他組件內,valve、logger、realm、loader、manager等。以logger舉例,在不同容器組件內分別定義。
valve類型:
AccessLogValve:訪問日志Valve
ExtendedAccessValve:擴展功能的訪問日志Valve
JDBCAccessLogValve:通過JDBC將訪問日志信息發送到數據庫中;
RequestDumperValve:請求轉儲Valve;
RemoteAddrValve:基于遠程地址的訪問控制;
RemoteHostValve:基于遠程主機名稱的訪問控制;
SemaphoreValve:用于控制Tomcat主機上任何容器上的并發訪問數量;
JvmRouteBinderValve:在配置多個Tomcat為以Apache通過mod_proxy或mod_jk作為前端的集群架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;
ReplicationValve:專用于Tomcat集群架構中,可以在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;
SingleSignOn:將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp;
ClusterSingleSingOn:對SingleSignOn的擴展,專用于Tomcat集群當中,需要結合ClusterSingleSignOnListener進行工作;RemoteHostValve和RemoteAddrValve可以分別用來實現基于主機名稱和基于IP地址的訪問控制,控制本身可以通過allow或deny來進行定義,這有點類似于Apache的訪問控制功能;
參數:
className:相關的java實現的類名,相應于分別應該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
allow:以逗號分開的允許訪問的IP地址列表,支持正則表達式,因此,點號“.”用于IP地址時需要轉義;僅定義allow項時,非明確allow的地址均被deny;
deny: 以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow;
realm:
JAASRealm:基于Java Authintication and Authorization Service實現用戶認證;
JDBCRealm:通過JDBC訪問某關系型數據庫表實現用戶認證;
JNDIRealm:基于JNDI使用目錄服務實現認證信息的獲取;
MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;
UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)實現用戶認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm兼容;它通過JNDI實現;
manager:
StandardManager
Tomcat6的默認會話管理器,用于非集群環境中對單個處于運行狀態的Tomcat實例會話進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫SESSION.ser的文件,并在Tomcat下次啟動時讀取此文件。
PersistentManager
當一個會話長時間處于空閑狀態時會被寫入到swap會話對象,這對于內存資源比較吃緊的應用環境來說比較有用。
DeltaManager
用于Tomcat集群的會話管理器,它通過將改變了會話數據同步給集群中的其它節點實現會話復制。這種實現會將所有會話的改變同步給集群中的每一個節點,也是在集群環境中用得最多的一種實現方式。
BackupManager
用于Tomcat集群的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給集群中的另一個而非所有節點。
SimpleTcpReplicationManager
集群類組件
listener、cluste
內部組成
名稱 | 說明 |
Server | 服務器,Tomcat 運行的進程實例,一個Server中可以有多個service,但通常就一個 |
Service | 服務,用來組織Engine和Connector的對應關系,一個service中只有一個Engine |
Connector | 連接器,負責客戶端的HTTP、HTTPS、AJP等協議連接。一個Connector只屬于某一個Engine |
Engine | 即引擎,用來響應并處理用戶請求。一個Engine上可以綁定多個Connector |
Host | 即虛擬主機,可以實現多虛擬主機,例如使用不同的主機頭區分 |
Context | 應用的上下文,配置特定url路徑映射和目錄的映射關系:url => director |
每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:
頂級組件:Server
服務類組件:Service
連接器組件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context
被嵌套類:valve, logger, realm, loader, manager, ...
集群類組件:listener, cluster, ...
?核心組件
- Tomcat啟動一個Server進程。可以啟動多個Server,即tomcat的多實例, 但一般只啟動一個
- 創建一個Service提供服務。可以創建多個Service,但一般也只創建一個
- 每個Service中,是Engine和其連接器Connector的關聯配置
- 可以為這個Service提供多個連接器Connector,這些Connector使用了不同的協議,綁定了不同的
- 端口。其作用就是處理來自客戶端的不同的連接請求或響應
- Service 內部還定義了Engine,引擎才是真正的處理請求的入口,其內部定義多個虛擬主機Host
- Engine對請求頭做了分析,將請求發送給相應的虛擬主機
- 如果沒有匹配,數據就發往Engine上的defaultHost缺省虛擬主機
- Engine上的缺省虛擬主機可以修改
- Host 定義虛擬主機,虛擬主機有name名稱,通過名稱匹配
- Context 定義應用程序單獨的路徑映射和配置
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"
/><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"><Context ><Context /></Host></Engine></Service>
</Server>
tomcat 處理請求過程
- 瀏覽器端的請求被發送到服務端端口8080,Tomcat進程監聽在此端口上。通過偵聽的HTTP/1.1Connector獲得此請求。
- Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的響應
- Engine獲得請求localhost:8080/test/index.jsp,遍歷它所有虛擬主機Host
- Engine匹配到名為localhost的Host。如果匹配不到,就把請求交給該Engine中的defaultHost處理
- localhost Host獲得請求/test/index.jsp,匹配它所擁有的所有Context
- Host匹配到路徑為/test的Context
- path=/test的Context獲得請求index.jsp,在它的mapping table中尋找對應的servlet
- Context匹配到URL PATTERN為 *.jsp 的servlet,對應于JspServlet類構造HttpServletRequest對象和HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法。
- Context把執行完了之后的HttpServletResponse對象返回給Host
- Host把HttpServletResponse對象返回給Engine
- Engine把HttpServletResponse對象返回給Connector
- Connector把HttpServletResponse對象返回給瀏覽器端