目錄結構
bin:可執行文件,包含啓動腳本 conf:配置文件 lib:tomcat的依賴庫 logs:日誌 temp:臨時文件 webapp:默認的應用部署目錄 work:供web應用使用,tomcat的工作目錄,放置tomcat運行中產生的一些文件,如,跑jsp時,翻譯出來的servlet一般在這裏面。 LICENSE:許可證文件 NOTICE、RELEASE-NOTES、RUNNING.txt:
JVM啓動參數配置 環境變量JAVA_OPTS -server-Xms512m -Xmx521m 最小堆內存,最大堆內存,一般可以一樣大 如:
//在本發起有效 export JAVA_OPTS = "-server-Xms2048m -Xmx2048m" //設置一直有效 cat ~/.bashrc //啓動-運行bin目錄下的對應啓動腳本 ./bin/startup.sh
配置文件
重要配置文件 server.xml 結構
Server 最頂層
Service 一個Server可配置多個Service
Connector 一個Service可以有多個Connector 用來接收用戶請求。
Engine 一個Service有一個Engine 用於處理Connect接收到的請求,包括平時寫的代碼也是由其執行。
Host 一個Engine可以有多個Host Host是虛擬主機的概念,即配置域名和ip。
Context 一個Host可有一個或多個Context。 一個Context即一個web應用。
對應組件的實現
Connector
1、Coyote組件,實現了許多不同的Connector 默認BIO Connector 使用傳統的 阻塞式的bio的操作的方式,實現方式也是傳統的java I/O的實現。 客戶端一個鏈接過來,服務端分配一個線程處理,若請求比較大,時間很久請求頭沒發完,對應的處理線程就只能一直等待。 2、Container 容器具體執行web應用代碼邏輯的部分。 具體實現:Catalina tomcat中實現容器的組件,最終都是由Catalina中的代碼執行的。
請求處理流程
java_tomcat_request01
參數配置
Connector
port address 監聽網絡請求時到哪個地址,一般會有多個ip,若不配置,會在所有地址上監聽。 protocol 協議,默認htpp1.1,調優可能會調整更高的。 connectionTimeout 多長時間不發請求則斷開,即連接超時時間 acceptCount 排隊隊列最大值。超過後,超出的會被拒絕處理,即不再處理後面的。 maxConnections 最大連接數。超過後值會接收但不處理。設置-1表示不設置連接數。 minSpareThreads 最小空閒線程數 maxThreads 最大線程數
Executor 線程池 事先創建一定數目的線程,當有任務時,從池中取出用完後再放回池中。 minSpareThreads 最小空閒線程數 maxThreads 最大線程數
當Connector同時配置依賴Executor和minSpareThreads/maxThreads,優先Executor。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" executor="tomcatThreadPool" redirectPort="8443" />
Tomcat日誌
作用
Tomca運行情況獲知 調試利器
分類
系統運行日誌:運行信息與狀態 訪問日誌:記錄請求訪問 應用日誌:應用程序打印日誌 訪問日誌: 配置文件 server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
directory :日誌目錄 prefix:日誌名前綴 suffix:日誌名後綴 pattern:日誌格式
請求方式(get/post等):method: %m 客戶端ip:client ip:%a 請求時刻:time:%t 用戶響應碼: status:%s 服務端下發字節數: byteSent: %b User-Agent:%{User-Agent}i
日誌切割 fileDateFormat="yyyy-MM-dd." --時戳格式 rotatable = "true" --是否開啓日誌滾動