编程知识 cdmana.com

【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. 重新啟動Tomcat5. 配置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.com7. 可以看到: ![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

版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1608873245.html

Scroll to Top