【轉】Tomcat中Connector常用配置(備忘)

本文轉載自http://deep.hongxi.org

Tomcat中server.xml有些配置信息是需要我們瞭解的,最起碼知道如何進行簡單的調試.

 

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"  redirectPort="8443" />

  

    默認情況下配置信息是這樣的,在dev環境中,基本上可以用了.如下,簡單的介紹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中增加一個啓動命令參數:

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

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

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"  
               connectionTimeout="20000"  
               maxHeaderCount="64"  
               maxParameterCount="64"  
               maxHttpHeaderSize="8192"  
               URIEncoding="UTF-8"  
               useBodyEncodingForURI="false"  
               maxThreads="128"  
               minSpareThreads="12"  
               acceptCount="1024"  
               connectionLinger="-1"  
               keepAliveTimeout="60"  
               maxKeepAliveRequests="32"  
               maxConnections="10000"  
               acceptorThreadCount="1"  
               pollerThreadCount="2"  
               selectorTimeout="1000"  
               useSendfile="true"  
               selectorPool.maxSelectors="128"  
               redirectPort="8443" />

  

 

參考:

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章