1. 程式人生 > >tomcat中server.xml中Connector各個引數的意義

tomcat中server.xml中Connector各個引數的意義

1. port 

    tomcat作為一個網路server端,它需要暴露一個socket埠來accept客戶端的連結,可以通過port指定.

2. protocol

    使用的網路協議,表示tomcat使用何種方式來接受和處理client端請求,"HTTP/1.1"是預設值,等效於"org.apache.coyote.http11.Http11Protocol";還有熟悉的"AJP/1.3";關於HTTP和AJP兩種方式的區別和效能優劣可以參見其他文件。【文件

    在Tomcat 6.0之後,還提供了NIO的方式,可以有效的提升效能,特別是在大量長連線/資料上傳+下載等web應用中.此時portocal="org.apache.coyote.http11.Http11NioProtocol".

    tomcat目前支援:BIO、NIO、NIO2、APR四種IO模型,預設為BIO。對於網際網路應用,我們應該在NIO、NIO2之間做選擇,因為它能夠有效的提升效能(主要是併發能力),其中NIO2即為AIO,需要JDK 1.7+、Linux 2.6+才能支援。

    BIO:JDK 1.5+,tomcat 5.x+

    NIO:JDK 1.6+,tomcat 6.x+

    NIO2:JDK 1.7+,tomcat 7.x+

    為了保守起見,我們暫且基於NIO模式。

3. connectionTimeout

    當client與tomcat建立連線之後,在"connectionTimeout"時間之內,仍然沒有得到client的請求資料,此時連線將會被斷開.此值的設定需要考慮到網路穩定型,同時也有效能的考慮.它和tcp的配置選項中的"socket_timeout"仍有區別,connectionTimeout只會在連結建立之後,得到client傳送http-request資訊前有效.

    預設值為60000,即60秒;對於網際網路應用,此值我們應該設定合理,比如20000。

4. maxHeaderCount

    http請求中header的最大個數,預設為100,"-1"表示不限制,通常不會關注此屬性,不過在一些設計"扭曲"的web應用中,使用header傳遞大量引數(:post)和校驗資訊時,可能需要調整此值.如果請求中的header個數超過此限定值,請求將會被拒絕.(避免惡性攻擊,建議此值設定為符合application的實際需要)

5. maxParameterCount

    http-get請求中允許傳遞的查詢字串的最大個數,儘管各種http瀏覽器(proxy工具)都會對http-get請求的長度和查詢字串的個數有限制,你仍然可以通過tomcat再次設定合適的值.parameter個數越多,事實上對tomcat的記憶體開支更大,很多時候處於安全或者實用的角度考慮,maxParameterCount的值都不會太大.預設值為10000,"-1"表示無限制.如果請求中引數的個數超過限定值,請求將會被拒絕.(為了避免惡性攻擊,請根據application實際需要設定此值。)

    為了安全和規範,maxHeaderCount和maxParamterCount通常應該合理,建議設定為100等;如果請求引數再多,那麼就建議使用post body傳送或者拆分請求。

6. maxPostSize

    http-post請求中資料(body)的最大尺寸,單位:byte,預設值為2M.這對一些表單提交(較多文字域)有影響.可以適度調整此值,大檔案上傳一般會在client拆分成小檔案,而不是直接傳送.

7. URIEncoding

    http-get請求中,使用何種字符集對查詢字串進行編碼,預設為"iso-8859-1".

8. useBodyEncodingForURI

    是否使用"Content-type"中指定的編碼方式對http-get請求中查詢字串進行編碼.如果為"true",將會忽略"URIEncoding"配置項,轉而使用header中"content-Type"指定的編碼方式.

9. maxThreads

    用於接收和處理client端請求的最大執行緒數,tomcat底層將採取執行緒池的方式來處理客戶端請求,此引數標識這執行緒池的尺寸.maxThreads意味著tomcat能夠併發執行request的個數.此值預設為200.一般情況下,在production環境中(根據物理機器配置,或者虛擬機器的限制來做參考值),通常會有微調.較大的值並不能提升tomcat的負載能力,事實上"200"個執行緒數,已經足夠大了.本人的線上環境為maxThreads=120.

    對於NIO模式下,maxThreads引數應該由CPU核心數決定,樂觀起見,此值為:cpu核數 * 2。太大的值,並不能提升NIO效能,反而會使效能下降,因為執行緒切換(CS)將會佔據CPU的大量時間。

10. compression

    是否對http相應資料啟用Gzip壓縮,可選值為"off"或者"on";這是一個值得商榷的引數;如果開啟壓縮,意味著較少的網路傳輸量,但是將消耗一定的CPU.如果你的應用有較高的CPU效能結餘,且響應資料均是一些文字字串,那麼開啟壓縮,會有較大的收益.(並不是所有的瀏覽器都能夠合理的支援gzip壓縮,特別是低版本)

11. acceptCount

    當tomcat請求處理執行緒池中的所有執行緒都處於忙碌狀態時,此時新建的連結將會被放入到pending佇列,acceptCount即是此佇列的容量,如果佇列已滿,此後所有的建立連結的請求(accept),都將被拒絕。預設為100。在高併發/短連結較多的環境中,可以適當增大此值;當長連結較多的場景中,可以將此值設定為0.

    這個引數將會在建立ServerSocket時帶入,為TCP底層引數。如果請求均為短連線、請求耗時較短,我們可以適當增加此值。
12. address

    當物理server上綁定了多個IP地址時,可以通過“address”來指定tomcat-server需要bind的地址.預設將port關聯到所有的ip上。
13. bufferSize

    連結在讀取stream時,buffer資料的尺寸。(非socket buffer)
14. connectionLinger

    socket linger引數值。當socket即將關閉時(前)阻塞的時間,單位:秒。如果設定為-1,表示關閉linger。在BIO(Blocking IO)和AJP連結中預設為100,NIO中預設為25.
15. keepAliveTimeout

    當無實際資料互動時,連結被保持的時間,單位:毫秒。在未指定此屬性時,將使用connectionTimeout作為keepAliveTimeout。通常和“HTTP keepAlive”選項協調工作。對於HTTP請求,server端為了支撐較高的吞吐量,不可能無限制的keepAlive一個連結(在設計要求上,這個和TCP通訊有本質的區別),keepAliveTimeout超時後,將會導致連結關閉。如果此tomcat設計為“長連結”服務,可以適當增加keepAliveTimeout值,否則無需設定此值。

 

    不過我們通常在tomcat上層還有nginx等代理伺服器,我們通常希望連結keepAlive的機制由代理伺服器控制,比如nginx來決定連結是否需要“保持活性”(注意,與keep_alive不同),當然nginx伺服器只會保留極少的長連線,幾乎所有的連結都會在使用結束後主動close;因為連結複用層,將有nginx與client保持,而不再是tomcat與client保持。太多的keepAlive連結,儘管提高了連結使用效率,但是對負載均衡不利。
16. maxKeepAliveRequests

    tomcat需要保持的最大請求數,即處於keepAlive狀態的請求的個數,建議此值為maxThreads * 0.5,不得大於maxThreads,否則將得不到預期的效果。-1表示不限制,1表示關閉keepAlive機制。

17、maxConnections

    tomcat允許接收和處理的最大連結數,對於BIO而言此值預設與maxThreads引數一樣,對於NIO而言此值預設為10000。對於tomcat已經接受和正在處理的執行緒數達到此值,server將允許繼續accept新連結但是不會處理它們,這些連結將會被阻塞直到連線數降低到此值(server將不會從這些socket中讀取資料,而是將它們的控制代碼buffer起來)。最終server是否可以繼續accept新的連結,取決於acceptCount值,因為此值是在建立ServerSocket時傳遞的引數,超過此值後,連結請求將會被拒絕。

   此值還受限於系統的ulimit、CPU、記憶體等配置。

18、acceptorThreadCount:預設為1,表示用於accept新連結的執行緒個數,如果在多核CPU架構下,此值可以設定為2,官方不建議設定超過2個的值。

19、maxHttpHeaderSize:http頭的最大尺寸,預設為8192,單位為“位元組”。

20、minSpareThreads:執行緒池中,保持活躍的執行緒的最小數量,預設為10。

21、SSLEnabled:是否開啟ssl支援,預設為false;通常SSL應該在nginx等代理層,我們不應該讓tomcat直接接入。

 

【如下為NIO配置】

22、pollerThreadCount:表示用於polling IO事件的執行緒個數,預設為1。在多核CPU架構下,我們可以設定為2來提高polling的能力,官方不建議設定大於2的值,因為鎖的競爭會導致效能下降,事實上一個執行緒也足夠快速。

23、useSendfile:是否開啟sendfile特性,預設為true。對於web應用而言,通常project中還會包含一定數量的靜態資源,比如圖片、CSS、js、html等,sendfile在一定程度上可以提高效能。

24、selectorTimeout:選擇器阻塞的時間,如果你進行過NIO開發,應該知道此引數的含義,預設值為1000毫秒。此值不要太大,因為selector執行緒本身還需要用來清理已關閉的連結等。

25、selectorPool.maxSelectors:NIO中選擇的個數,預設值為200。NIO中我們可以使用多個selector,每個selector負責註冊一定數量的NIOChannel,這樣可以有效的提高selector選擇效率;通常我們建議此值與maxThreads值一致,或者小於maxThreads,但是大於maxThreads其實意義並不大。

    為了開啟此特性,我們需要在catalina.sh中增加一個啟動命令引數:

Java程式碼 

 收藏程式碼

  1. CATALINA_OPTS="-Dorg.apache.tomcat.util.net.NioSelectorShared=false"  

    官方的意思是使用command-line-options="-Dorg.apache.tomcat.util.net.NioSelectorShared=false",但是經過測試發現並不能生效。這個命令引數的意思是“不使用共享的selector,而是每個thread單獨使用各自的selector。”

 

Java程式碼 

 收藏程式碼

  1. <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"  
  2.                connectionTimeout="20000"  
  3.                maxHeaderCount="64"  
  4.                maxParameterCount="64"  
  5.                maxHttpHeaderSize="8192"  
  6.                URIEncoding="UTF-8"  
  7.                useBodyEncodingForURI="false"  
  8.                maxThreads="128"  
  9.                minSpareThreads="12"  
  10.                acceptCount="1024"  
  11.                connectionLinger="-1"  
  12.                keepAliveTimeout="60"  
  13.                maxKeepAliveRequests="32"  
  14.                maxConnections="10000"  
  15.                acceptorThreadCount="1"  
  16.                pollerThreadCount="2"  
  17.                selectorTimeout="1000"  
  18.                useSendfile="true"  
  19.                selectorPool.maxSelectors="128"  
  20.                redirectPort="8443" />  

 

參考:

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

https://tomcat.apache.org/tomcat-8.0-doc/config/http.html