tomcat 配置文件server.xml 詳解 Connector Engine Host Context

image

一 server.xml

server.xml 是tomcat 的核心配置文件,位於./conf/ 下.具備server,connector
Hosts 等元素模塊。接下來咱們看看吧。(導遊介紹詞)。本文內容基於tomcat 8.5 不一樣版本配置或有差別性。
tomcat 8.5是基於Servlet 3.1和JavaServer Pages 2.3。css

tomcat 測試war包下載路徑 測試war包html

server.xml 結構圖(還有些其餘元素沒有加入)
imagejava

1.1 server 配置

server 是server.xml 的最外層元素,經常使用的屬性有:web

屬性 描述 示例
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 的屬性express

屬性 描述
className 要使用的java類名,未指定的話就使用標準的實現
name service顯示的名稱

1.3 Executor

官方文檔連接
這個元素咱們在平時配置的過程當中用得比較少,它主要用於在多個connector 之間進行共享線程池。它的位置應該在 connector 以前,這樣才能生效。apache

Executor 的屬性 :tomcat

屬性 描述 示例
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 配置說明(網上盜圖,不提倡啊,哈哈)
image

1.5 Engine

Engine 結構示意圖

image

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/ / "
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 &quot;%r&quot; %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"時才能夠設置的

示例:

  1. 僅容許從localhost 鏈接
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
   allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>
  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 元素定義的三種方式:

  1. conf/server.xml (不建議)
    示例
<Context  path="/djx"  docBase="/tmp/svnadmin.war"/>
  1. 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>
  1. 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 路徑命名示例
image

WatchedResource 屬性,用於監控war包後的解壓文件,若是更改則自動從新加載
示例:

<WatchedResource>WEB-INF/web.xml</WatchedResource>

以上就是server.xml 的一些元素和屬性,還有一些咱們沒有列舉的,咱們能夠去官網文檔查看。

其餘tocmat 文章

tomcat 安裝部署
jenkins 自動部署到tomcat 插件
tomcat-部署項目的三種方法
tomcat 日誌詳解
針對tomcat 的自問自答與總結
tomcat 的重複部署加載問題解決辦法
tomcat 讀取context 順序
tomcat 更新部署的多種狀況

相關文章
相關標籤/搜索