【Tomcat】Tomcat伺服器核心配置說明及標籤
阿新 • • 發佈:2020-12-25
[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