1. 程式人生 > >【Tomcat】Tomcat伺服器核心配置說明及標籤

【Tomcat】Tomcat伺服器核心配置說明及標籤

[Toc] > 首先帶著疑問 > > 問題一:去哪配置? > 核心配置在Tomcat目錄下 `conf/`目錄下的`server.xml`檔案中 > > 問題二:怎麼配置? > > 如下 - Tomcat 作為伺服器的配置,主要是 server.xml ⽂件的配置; - server.xml中包含了 Servlet容器的相關配置,即 Catalina 的配置; ![2020-12-24_230624](https://typora-files.oss-cn-beijing.aliyuncs.com/file/2020-12-24_230624.png) ## 一,主要標籤結構 ```xml
``` ## 二,Server標籤 ### 標籤屬性: - port - shutdown 說明Tomcat來監聽port埠來執行關閉 ```xml ... ``` ### 子標籤: - **Listener** - VersionLoggerListener(以⽇志形式輸出伺服器 、作業系統、JVM的版本資訊) - AprLifecycleListener (載入(伺服器啟動) 和 銷燬 (伺服器停⽌) APR。 如果找不到APR庫, 則會輸出⽇志, 並不影響 Tomcat啟動) - JreMemoryLeakPreventionListener (避免JRE記憶體洩漏問題) - GlobalResourcesLifecycleListener (載入(伺服器啟動) 和 銷燬(伺服器停⽌) 全域性命名服務) - ThreadLocalLeakPreventionListener (在Context停⽌時重建 Executor 池中的執行緒, 以避免ThreadLocal 相關的記憶體洩漏) - **GlobalNamingResources** (中定義了全域性命名服務) - **Service** (如下) 以上標籤`Listener`、`GlobalNamingResources`一般情況下保持預設即可,不需要而外操作,重點在於**Service** 標籤 ## 三,Service 標籤 ```xml ...
``` 該標籤⽤於建立 Service 例項,預設使⽤ `org.apache.catalina.core.StandardService`。 預設情況下,Tomcat 僅指定了Service 的名稱, 值為 "**Catalina**"。 ### 子標籤: - **Listener** (Listener ⽤於為Service新增⽣命週期監聽器) - **Executor** (⽤於配置Service 共享執行緒池,給Connector使用) - **Connector** (⽤於配置Service 包含的連結器) - **Engine** (⽤於配置Service中連結器對應的Servlet 容器引擎) ## 四,Executor 標籤 用來定義共享執行緒池的。 ![image-20201224233733864](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201224233733864.png) 預設是被註釋掉的,且屬性不全。那麼該如何使用呢? **預設情況下,Service 並未新增共享執行緒池配置。 如果我們想新增⼀個執行緒池, 可以在下新增如下配置:** ```xml
``` ### 屬性: - **name**:執行緒池名稱,**⽤於 Connector中指定** - **namePrefix**:所建立的每個執行緒的名稱字首,⼀個單獨的執行緒名稱為 namePrefix+threadNumber - **maxThreads**:池中最⼤執行緒數 - **minSpareThreads**:活躍執行緒數,也就是核⼼池執行緒數,這些執行緒不會被銷燬,會⼀直存在 - **maxIdleTime**:執行緒空閒時間,超過該時間後,空閒執行緒會被銷燬,預設值為6000(1分鐘),單位 毫秒 - **maxQueueSize**:在被執⾏前最⼤執行緒排隊數⽬,預設為Int的最⼤值,也就是⼴義的⽆限。除⾮特殊情況,這個值不需要更改,否則會有請求不會被處理的情況發⽣ - **prestartminSpareThreads**:啟動執行緒池時是否啟動 **minSpareThreads**部分執行緒。預設值為 **false**,即不啟動 - **threadPriority**:執行緒池中執行緒優先順序,預設值為5,值從1到10 - **className**:執行緒池實現類,未指定情況下,預設實現類為: `org.apache.catalina.core.StandardThreadExecutor`。如果想使⽤⾃定義執行緒池⾸先需要實現 `org.apache.catalina.Executor`接⼝ ## 五,Connector標籤 Connector 標籤⽤於建立連結器例項預設情況下,`server.xml`配置了兩個連結器,⼀個⽀持**HTTP協議**,⼀個⽀持**AJP協議**,⼤多數情況下,我們並不需要新增連結器配置,只是根據需要對已有連結器進⾏優化。 ```xml ``` ### 屬性: - **port**:端⼝號,Connector ⽤於建立服務端Socket 並進⾏監聽, 以等待客戶端請求連結。如果該屬性設定 為0, Tomcat將會隨機選擇⼀個可⽤的端⼝號給當前Connector 使⽤ - **protocol**:當前Connector ⽀持的訪問協議。 預設為 HTTP/1.1 , 並採⽤⾃動切換機制選擇⼀個基於 JAVA NIO 的連結器或者基於本地APR的連結器(根據本地是否含有Tomcat的本地庫判定) - **connectionTimeOut**: Connector接收連結後的等待超時時間, 單位為毫秒。 -1 表示不超時。 - **redirectPort**: 當前Connector 不⽀持SSL請求, 接收到了⼀個請求, 並且也符合security-constraint 約束, 需要SSL傳輸,Catalina⾃動將請求重定向到指定的端⼝。**比如說:如果訪問的是8080埠,然後它發現是一個https的請求,那麼他就會轉發到8443埠**,當然也可以直接訪問8443埠 - **executor**: 指定共享執行緒池的名稱(**就是Executor標籤的name屬性**), 也可以通過`maxThreads`、`minSpareThreads`等屬性配置內部執行緒池。 - **URIEncoding**: ⽤於指定編碼URI的字元編碼, **Tomcat8.x版本預設的編碼為 UTF-8** , **Tomcat7.x版本預設為ISO8859-1** **可以使用共享執行緒池:** ```xml ``` > 可以看到`Connector`標籤和`Executor`都有`maxThreads`和`minSpareThreads`標籤。 > > **每一個Connector都可以自己定義一個執行緒池,如果每個Connector都自己定義執行緒池就浪費了。所以為什麼不用一個呢?於是就有了Executor標籤來定義一個共享執行緒池。** ## 六,Engine標籤 Engine 表示 Servlet 引擎 ```xml ... ``` ### 屬性: - **name**:⽤於指定Engine 的名稱, 預設為Catalina - **defaultHost**:預設使⽤的虛擬主機名稱, 當客戶端請求指向的主機⽆效時, 將交由預設的虛擬主機處理, 預設為localhost ![image-20201225005456558](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225005456558.png) ### 子標籤: - **Cluster**:叢集方面的標籤 - **Realm**:驗證安全的標籤 - **Host**:⽤於配置⼀個虛擬主機 ## 七,Host標籤 ```xml ... ``` ### 標籤屬性: - **appBase**:這個網站的程式存放的位置,可以是絕對路徑也可以是相對路徑。webapps就是相對路徑,在tomcat的根目錄下 - **unpackWARs**:預設為true,把war包解壓成資料夾 - **autoDeploy**:自動部署,當資源變更時自動部署,類似於熱部署 ### 子標籤: ```xml ``` 當請求來臨時,日誌存放起來, - 存放在`directory`值的目錄 - **prefix**:日誌檔案字首 - **suffix**:日誌檔案字尾 - **pattern**:列印的日誌格式 ### 啟動Tomcat 瀏覽器輸入:http://localhost:8080 ![image-20201225011255980](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225011255980.png) ![image-20201225011309987](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225011309987.png) ``` xml ``` hostname是**localhost**,appBase是**webapps**,去**webapps**資料夾下找應用程式資料夾,沒有指定,預設就去ROOT資料夾下: ![image-20201225011532363](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225011532363.png) ### 我們來做個實驗: 1. 把host標籤複製一份,兩個host標籤的name分別為`www.abc.com`,`www.def.com`。appBase分別為`webapps`、`webapps2` ![image-20201225012119802](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225012119802.png) 2. 進入Tomcat根目錄,把webapps拷貝一份到根目錄,命名為webapps2 ![image-20201225012241881](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225012241881.png) 3. 為了方便區分,把webapps2/ROOT/index.jsp 中的**Home**改為**Home-webapps2** ![image-20201225012344132](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225012344132.png) 4. 重新啟動Tomcat 5. 配置hosts檔案 ![image-20201225012858171](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225012858171.png) 6. 訪問瀏覽器http://localhost:8080、 http://www.abc.com和http://www.def.com 7. 可以看到: ![image-20201225013221920](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225013221920.png) 可以看到localhost:8080訪問不到了,因為這個虛擬主機被我們修改了 而abc和def均可以找到。同時def.com的Home也被修改為Home-webapps2了。 ## 八,Context標籤 用於配置一個Web應用——**一個虛擬主機下可以配置多個應用** ```xml ``` > 剛才我們訪問的是`http://www.abc.com:8080`,那麼現在我想輸入`http://www.abc.com:8080/dengxh`,**dengxh**所代表的位置是我的磁碟上的某個資料夾,這個資料夾裡放的我的程式資源。如何做? 1. 為了方便演示,我們就拿ROOT中的程式做例子,把**webapps中的ROOT資料夾複製到E盤根目錄**,**取名為dengxhh** 2. 在Host標籤中,增加` ` 3. 重啟Tomcat,訪問www.abc.com/dengxh/ ,成功跳轉了。 ![image-20201225014648017](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225014648017.png) 如此操作就可以在一個虛擬主機中,配置多個應用,只需要在host標籤中配置多個Context標籤,區分的時候只需要在虛擬主機後跟上Context的path屬性的值即可找到對應的資源。 例如:Host name="www.abc.com" ,Context path ="dengxh" ,那麼瀏覽器中輸入 `www.abc.com/dengxh`即可。 --- ## 總結: ![image-20201225021451534](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225021451534.png) ![image-20201225021557645](https://typora-files.oss-cn-beijing.aliyuncs.com/file/image-20201225021557645.png) **思維導圖線上觀看地址:**https://www.processon.com/view/link/5fe4da565653bb054783ca6e