
一 server.xml
server.xml 是tomcat 的核心配置文件,位於./conf/ 下.具有server,connector
Hosts 等元素模塊。接下來我們看看吧。(導游介紹詞)。本文內容基於tomcat 8.5 不同版本配置或有差異性。
tomcat 8.5是基於Servlet 3.1和JavaServer Pages 2.3。
tomcat 測試war包下載路徑 測試war包
server.xml 結構圖(還有些其他元素沒有加入)
1.1 server 配置
server 是server.xml 的最外層元素,常用的屬性有:
屬性 | 描述 | 示例 |
---|---|---|
className | 要使用的java 類名 | |
address | 服務器等待接收shutdown 命令的地址,默認localhost | |
port | 接收shutdown命令的端口,設置為-1 為禁用關閉端口,也就是你不能通過這種方式來關閉了,這樣就會影響你使用腳本(catalina.sh 或者是shutdown.sh)來stop了,默認綁定8005端口 | port="8005" |
shutdown | 指定shutdown 命令的別名,默認值SHUTDOWN | shutdown="SHUTDOWN" |
1.2 service 配置
service 是 server 的內層。可以將一個多個service 放在server 層里,
一個service 里面可以有多個 Connector 和一個Engine .
service 的屬性
屬性 | 描述 |
---|---|
className | 要使用的java類名,未指定的話就使用標准的實現 |
name | service顯示的名稱 |
1.3 Executor
官方文檔鏈接
這個元素我們在平時配置的過程中用得比較少,它主要用於在多個connector 之間進行共享線程池。它的位置應該在 connector 之前,這樣才能生效。
Executor 的屬性 :
屬性 | 描述 | 示例 |
---|---|---|
className | 要使用的java類名 | |
name | 用於在server.xml中的其他位置引用此池的名稱。該名稱是必需的,必須是唯一的。 | |
threadPriority | 執行程序中線程的優先級 ,默認為5 | |
daemon | 線程是否為守護線程,默認為 True | |
namePrefix | 每個線程的名稱的前綴,單個線程的名稱=namePrefix+threadNumber | |
maxThreads | 該線程池中最大的線程數,默認為200 | |
minSpareThreads | 最小線程數,就是在空閑時保持的最少線程數 ,默認為25 | |
maxIdleTime | 空閑線程關閉之前等待的時間,單位毫秒,默認是6000毫秒也就是一分鍾 | |
maxQueueSize | 最大任務等待的數量,默認值是Integer.MAX_VALUE,也就是2147483647(java int整數的最大值) | |
prestartminSpareThreads | 是否應該在啟動Executor時啟動minSpareThreads,默認值為 false |
1.4 Connector 配置
關於 Connector 官網鏈接
當前以下所有的說明是針對 tomcat 8.5版本來說的,其他版本詳情見官方文檔。
參數 | 含義 | 示例 |
---|---|---|
port | 綁定的端口,如果設置為0,tomcat則隨機獲取一個空閑端口 | 默認 port="8080" |
protocol | 傳輸協議和版本 | 默認 protocol = "HTTP/1.1" |
connectionTimeout | 連接超時時間,單位毫秒 | 默認 connectionTimeout="20000" |
redirectPort | 接收到的ssl請求后重定向的端口 | 默認 redirectPort="8443" |
maxThreads | tomcat能創建來處理請求的最大線程數,也為最大並發數 超過則放入請求隊列中進行排隊,默認值為200;需要根據業務和系統性能進行調整 | maxThreads="1000" |
URIEncoding | url的字符編碼,在tomcat8.5版本中,該值默認為UTF-8,除非在org.apache.catalina.STRICT_SERVLET_COMPLIANCE 將system property 設置為true才會使用ISO-8859-1 | URIEncoding="UTF-8" |
minProcessors | 啟動時創建的線程數(最小線程數) | minProcessors="50" |
acceptCount | 指定當所有可以使用的處理請求的線程數都被使用時,可以放到隊列中的請求數,就是被排隊的請求數,超過這個數的請求將拒絕連接 默認值為100 | acceptcount="500" |
acceptorThreadCount | 可以用於接受連接的進程數,默認為1,但是在一些多核的的服務器上,我們會將它的值設置為2或者更大的數,來應對一些不活躍的連接。 | |
minSpareThreads | 最小空閑線程數,任何情況都會存活的線程數,即便超過了最大空閑時間,也不會被回收,默認值10; | minSpareThreads="25" |
maxSpareThreads | 最大空閑線程數,在最大空閑時間(maxIdleTime)內活躍過,此時空閑,當空閑時間大於maxIdleTime則被回收,小則繼續存活,等待被調度,默認值50; | |
enableLookups | 調用request、getRemoteHost()執行DNS查詢,以返回遠程主機的主機名,如果設置為false,則直接返回IP地址 默認是禁用的,在請求過濾中的根據遠程主機名過濾,需要將該參數設置為true | enableLookups="false" |
maxIdleTime | 最大空閑時間,超過這個空閑時間,且線程數大於minSpareThreads的,都會被回收,默認值1分鍾(60000ms) | maxPostSize |
address | 對於一些具有多個ip的服務器,我們可以通過該參數指定綁定的ip,默認情況下監聽所有的地址 | address="192.168.1.110" |
compressibleMimeType | 該值用來指定哪些文件類型的文件可以進行壓縮,默認值為:text/html,text/xml,text/plain,text/css,text/javascript,application/javascript | |
compression | 開啟gzip 壓縮,可以接受的值是 "off"(禁用壓縮),"on"(開啟壓縮),"force(強制壓縮)","1-9"(等效於開啟壓縮,並且設定壓縮等級),開啟了壓縮,也就意味着要占用更多的cpu資源 | compression |
compressionMinSize | 在compression 參數指定為on后,該參數用來指定壓縮的閾值,只有大於該閾值才會被壓縮,默認為 2048 | |
keepAliveTimeout | 指connector兩個HTTP請求直接的等待時間,超過該時間沒有接收到第二個HTTP請求就關閉連接,默認是使用connectionTimeout 的值,單位為毫秒 | |
maxConnections | 在一定時間內可以接受和處理的最大連接數,達到限制后,服務器接受但不處理該鏈接,但可以存放到acceptCount,該默認值因連接器類型而異。對於NIO和NIO2,默認值為10000。對於APR / native,默認為8192。 | |
maxCookieCount | 請求允許的最大cookie 數,值小於0表示無限制,默認值為 200 | |
disableUploadTimeout | 默認是true ,禁用數據上傳超時 | |
connectionUploadTimeout | 設定數據上傳的超時時間,只有在disableUploadTimeout設置為false才生效,單位毫秒 | connectionUploadTimeout="50000" |
processorCache | 進程緩沖器,默認值是maxThreads的值,使用好該值可以提升並發請求。 |
示例配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
acceptCount="300" <!--默認值為100-->
acceptorThreadCount="2" <!--默認值為1,在多核的情況下可設置該值-->
compression="on" <!-- 開啟對響應數據的壓縮傳輸-->
keepAliveTimeout="25000" <!-- 等待請求時間 默認值是使用為connectionTimeout屬性設置的值 -->
maxConnections="5000" <!-- 服務器在給定時間接受和處理的最大連接數,對於NIO和NIO2,默認值為10000。對於APR / native,默認為8192。-->
maxThreads="400" <!-- 最大並發數,默認為200-->
minSpareThreads="25" <!-- 始終保持運行的最小連接數,默認值為10-->
/>
maxThreads 配置說明(網上盜圖,不提倡啊,哈哈)
1.5 Engine
Engine 結構示意圖
Engine 的屬性
屬性 | 描述 |
---|---|
className | 要使用的實現的Java類名。 |
defaultHost | 默認的主機名 |
name | Engine 的名稱,在一個server 中使用多個service元素時,必須給每個Engine分配一個唯一的名稱 |
startStopThreads | 啟動Host 的線程數,默認為1 |
Engine 必須嵌套在service 中。
Host(官網文檔鏈接)
host 元素表示一個虛擬主機,我們常將一個主機與一個應用程序相連接
host 元素嵌套在Engine 元素里面。我們可以將Context 元素嵌套在Host元素里面。
Host 的屬性
屬性 | 描述 |
---|---|
name | 域名名稱,tomcat會將其全部轉化為小寫,如果你設置的是*.baidu.com,那么你將匹配www.baidu.com admin.baidu.com 等等以baidu.com 結尾的域名。那么只有是符合該域名的條件的請求才能接受。 |
appBase | 指的是虛擬主機的應用程序目錄,可以是絕對路徑,也可以是相對tomcat目錄的相對路徑,如果未指定將使用默認值"webapps" |
unpackWARs | 默認為true,如果設置為true 表示將web應用程序war包解壓,false表示直接從war文件運行。注意點1:如果設置為true,tomcat解壓了該應該程序的包,會向該解壓縮的包里面添加一個文件(/META-INF/war-tracker),用於在tomcat未運行時檢測war文件(注意是war文件而不是解壓目錄里面的文件)是否更改。如果war文件更改了,則會重新加載。是針對未啟動的時候啊,如果是tomcat正常啟動的話更改war包的話是會自動重新加載發布的。注意點2: 如果該屬性設置為false的話將導致性能下降 |
autoDeploy | 指tomcat在運行時是否要定期檢查有沒有新的應用程序,如果true,tomcat會定期檢查appBase 和xmlBase 目錄,如果找到了會自動部署的web應用程序,默認為true |
xmlBase | 指包含該Host部署的應用程序的Context的xml文件路徑。可以是絕對路徑也可以是相對tomcat目錄的相對路徑。如果未指定將使用"conf/<engine_name>/<host_name>" |
createDirs | 指在tomcat啟動的時候將創建appBase和xmlBase定義的目錄,默認為true |
className | 要使用的實現的Java類名,如果沒有指定,將使用標准值。 |
deployIgnore | 這個屬性是相對appBase的,foo只能匹配文件或者目錄foo,而不能匹配foo.war |
deployOnStartup | 指tomcat在啟動時是否應該自動部署來自該Host的web應用程序,默認為true |
startStopThreads | 指Host用於啟動Context的線程數,默認值為1 |
undeployOldVersions | 在自動部署的情況下,tomcat是否檢查舊的未使用的web應用程序,如果找到,將其刪除,在autoDeploy為true且本屬性為true才生效,默認值為false |
deployXML | 如果你不想使用web應用程序的/META-INF/context.xml,你可以將該值設置為false,線上環境也建議設置為false, |
copyXML | 該屬性的值如果設置為true,會在程序啟動時(且xmlBase無該應用程序對應的xml文件)將位於應用程序的/META-INF/context.xml 的文件,復制到xmlBase下,如果有的話是不會復制的,后續是會以xmlBase里的xml的配置為主的,即使應用程序的/META-INF/context.xml更新了,也是不會生效的。默認為false. copyXML的屬性要生效的話前提得deployXML 屬性為true,否則不生效。 |
workDir | 指該Host 應用程序要使用的臨時目錄的路徑名,如果在Context中也指定了workDir將替換掉這里的配置,如果未指定,默認為$CATALINA_BASE/work。 |
當autoDeploy 為true 時,tomcat 在啟動后會監控部署的web應用程序的文件是否改變,根據具體的改變,web應用程序將重新加載或重新部署。重新部署的不會保留用戶會話,重新加載的則會保留。
Context 中的docBase 的路徑應該在appBase(Host)之外,否則可能會導致部署兩次,屬性deployIgnore可以避免這種情況。
如果在server.xml 中定義了Context 屬性,則應該關閉deployIgnore,和自動部署應用程序。
日志記錄(官網鏈接)
屬性 | 描述 |
---|---|
buffered | 是否緩沖日志記錄,默認為True,如果設置為false,則在每次請求后將寫入訪問日志記錄 |
className | 要使用的實現的java類名 |
directory | 存放日志文件的目錄的相對路徑或者絕對路徑,默認值為$ CATALINA_BASE/logs |
encoding | 用於寫日志文件的字符集。空字符串表示使用系統默認字符集。默認值:使用系統默認字符集。 |
fileDateFormat | 設定訪問日志文件切割時間,默認值為.yyyy-MM-dd,也就是每天切割一次,如果你希望每小時切割一次則設置為.yyyy-MM-dd.HH |
maxDays | 保留日志的最大天數,如果未指定的話,默認值為-1,意味着將永遠不會刪除舊文件 |
maxLogMessageBufferSize | 日志消息緩沖區大小,默認大小為256bytes,該值應該設置為大於常規日志的消息大小 |
prefix | 日志前綴,為每個日志文件名稱的開頭,如果未指定,則默認值為"access_log" |
renameOnRotate | 設置為true 時,當天的日志是不會帶有時間戳的,過往日志是會帶有的,設置為false當天的日志也帶有時間戳的,默認為false |
rotatable | 用於設置日志是否切割的標准,默認為true,如果設置為false的話,則該文件永遠不會被切割,且忽略參數fileDateFormat |
suffix | 日志文件的后綴名稱,默認為"",表示不添加后綴 |
pattern | 是指日志格式,也就是我們日志輸出的內容和格式具體配置見下文 |
pattern
%a - 遠程IP地址
%A - 本地IP地址
%b - 發送的字節數,不包括HTTP標頭,如果為零則為“ - ”
%B - 發送的字節數,不包括HTTP標頭
%h - 遠程主機名(如果enableLookups連接器為false,則為IP地址 )
%H - 請求協議
%l - 來自identd的遠程邏輯用戶名(始終返回' - ')
%m - 請求方法(GET,POST等)
%p - 收到此請求的本地端口。
%q - 查詢字符串(前綴為'?',如果存在)
%r - 請求首行(方法和請求URI)
%s - 響應的HTTP狀態代碼
%S - 用戶會話ID
%t - 日期和時間,采用通用日志格式
%u - 經過身份驗證的遠程用戶(如果有),否則為“ - ”
%U - 請求的URL路徑
%v - 本地服務器名稱
%D - 處理請求所用的時間(以毫秒為單位)
%T - 處理請求所用的時間,以秒為單位
%F - 提交響應所用的時間,以毫秒為單位
%I - 當前請求線程名稱
%X - 響應完成時的連接狀態:
X =連接在響應完成之前中止。
+ =發送響應后,連接可以保持活動狀態。
- =發送響應后將關閉連接。
pattern="common" 對應於'%h%l%u%t“%r”%s%b'定義的通用日志格式 。
pattern="combined" 將 每個雙引號中的Referer和User-Agent標題的值附加到common模式。
默認訪問日志配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
請求過濾器(基於請求ip 官網鏈接)
基於ip地址對請求進行過濾處理。限制條件可以使用正則表達式,但是它和普通的正則語法有所不同,它采用的是java.util.regex 包。可以用";" 來分割端口限制。
拒絕請求時的行為可以更改為不拒絕,而是設置無效的authentication 標頭。這與context屬性 preemptiveAuthentication="true" 結合使用。
在過濾帶有ipv6地址的請求的時候,需要注意過濾器匹配的ip地址格式,詳細見官網。
屬性 | 描述 |
---|---|
className | 要使用的實現的Java類名 |
allow | ip地址,多個以逗號分隔如果指定了此屬性,則遠程地址必須匹配此請求才能被接受。如果未指定此屬性,則將接受所有請求,除非遠程IP與deny屬性中的網絡掩碼匹配。 |
deny | ip地址,多個以逗號分隔如果指定了此屬性,如果指定了此屬性,則遠程地址必須不匹配才能接受此請求。如果未指定此屬性,則請求接受僅受accept 屬性控制。 |
denyStatus | 拒絕請求時使用的HTTP響應狀態代碼。默認值為403。例如,它可以設置為值404。 |
addConnectorPort | 匹配請求的主機名和端口,設置為true 的話ip(deny的值)和端口(connector 端口)都符合要求的話才能接受請求,默認為false |
invalidAuthenticationWhenDeny | 當請求要被拒絕時,不要直接拒絕,采用設置無效的authentication標頭,來拒絕,這是在context設置 preemptiveAuthentication="true"時才可以設置的 |
示例:
- 僅允許從localhost 連接
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
- 僅允許允許從localhost 連接,但其它客戶端連接到8443的不受限制
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
addConnectorPort="true"
allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/>
3.允許任何客戶端請求訪問8009端口,其它端口要觸發身份驗證
<Context>
...
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
addConnectorPort="true"
invalidAuthenticationWhenDeny="true"
allow=".*;8009"/>
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
...
</Context>
請求過濾器(基於請求主機名 官網鏈接)
用於限制不符合條件的客戶端,接收符合條件的客戶端。
限制條件可以使用正則表達式,但是它和普通的正則語法有所不同,它采用的是java.util.regex 包。
拒絕請求時的行為可以更改為不拒絕,而是設置無效的authentication 標頭。這與context屬性 preemptiveAuthentication="true" 結合使用。
注意:此過濾器返回的值獲取方法ServletRequest.getRemoteHost()需要獲取正確的主機名。要允許該方法返回正確的主機名,您必須在 connector 上啟用 enableLookups 參數。(因為該過濾器是基於主機名過濾,所以要開啟獲取主機名才能獲取到主機名的值)
屬性 | 描述 |
---|---|
className | 要使用的實現的java類名 |
allow | 請求的主機名和正則表達式進行比較,如果指定了該屬性,必須要滿足條件才能接受請求,如果未指定此屬性,則除非請求主機名與deny 模式匹配,否則將接受所有請求。 |
deny | 滿足該條件的請求被拒絕,如果未指定此屬性,則請求接受僅受allow屬性控制 |
denyStatus | 拒絕請求時使用的HTTP響應狀態代碼。默認值為403。例如,它可以設置為值404。 |
addConnectorPort | 匹配請求的主機名和端口,設置為true 的話 ip(deny的值)和端口(connector 端口)都符合要求的話才能接受請求,默認為false |
invalidAuthenticationWhenDeny | 當請求要被拒絕時,不要直接拒絕,采用設置無效的authentication標頭,來拒絕,這是在context設置 preemptiveAuthentication="true"時才可以設置的 |
context 配置 (官網鏈接)
It is NOT recommended to place <Context> elements directly in the server.xml file.
建議我們不要將context 直接放在server.xml 文件里面,因為這樣不太安全。放在conf/server.xml 下的話,如果不重新啟動tomcat的話是無法加載里面的配置的。如果我們在其他位置也配置了context的話,是會覆蓋server.xml 的配置的。如果我們仍要以server.xml 的文件為主的話,那么我們需要將context 的override 參數設置為true .
但我實際測試的話,發現不設置override為true ,在server.xml 和conf/Catalina/localhost/djx.xml 配置相同的path 名稱,不同的war包最后還是server.xml 生效了。
context 元素定義的三種方式:
- conf/server.xml (不建議)
示例
<Context path="/djx" docBase="/tmp/svnadmin.war"/>
- webapps/appname/META-INF/context.xml,
示例: manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
- conf/Catalina/localhost/djx.xml ,文件名為訪問路徑,示例:
<Context docBase="/tmp/sample.war" reloadable="false" />
注意點
除了server.xml 外,任何定義Context的文件只能定義一個context 元素
context 的屬性
屬性 | 描述 | 示例 |
---|---|---|
docBase | web應用程序的路徑,如果使用了符號鏈接的話,那么更改了鏈接的話需要重新啟動tomcat才能生效 | docBase="/tmp/svnadmin.war" |
override | 設置為true,則忽略全局中的設置,以現有的來覆蓋之前的,默認為false | |
path | 匹配對應的web應用,與請求的url的開頭匹配,如果指定為""的話,該應用接收未匹配的所有請求 | |
reloadable | 設置為true表示Catalina將監視 /WEB-INF/classes/和/WEB-INF/lib的文件,一旦發生更改將自動重新加載Web應用程序。它可以在在開發的時候使用,但需要消耗更多資源,官方文檔寫到不建議在生產環境上使用,所以它的默認值是false. | |
workDir | 設置臨時文件和目錄的路徑,如果未指定,默認臨時目錄在在$CATALINA_BASE/work | |
preemptiveAuthentication | 默認為false,當設置為true,用戶為不受安全約束保護的資源提供憑據,如果身份驗證器支持搶占式身份驗證,那么將處理用戶的憑據,該參數和過濾請求中的屬性invalidAuthenticationWhenDeny關聯 |
Context 路徑命名示例
WatchedResource 屬性,用於監控war包后的解壓文件,如果更改則自動重新加載
示例:
<WatchedResource>WEB-INF/web.xml</WatchedResource>
以上就是server.xml 的一些元素和屬性,還有一些我們沒有列舉的,我們可以去官網文檔查看。
其他tocmat 文章
tomcat 安裝部署
jenkins 自動部署到tomcat 插件
tomcat-部署項目的三種方法
tomcat 日志詳解
針對tomcat 的自問自答與總結
tomcat 的重復部署加載問題解決辦法
tomcat 讀取context 順序
tomcat 更新部署的多種情況