Tomcat 7 HTTP 鏈接器

0 摘要

本文嘗試翻譯Tomcat官方文檔Apache Tomcat 7鏈接器,不足之處敬請指正。該文先介紹了Tomcat7 HTTP鏈接器的屬性,包括:公共屬性、標準實現、Java TCP套接字屬性、BIO的具體配置、NIO的具體配置、APR/Native的具體配置。接着介紹了Tomcat的特殊功能,包括:HTTP/1.1和HTTP/1.0的支持、代理支持、SSL支持以及鏈接器的比較。html

1 介紹

HTTP 鏈接器元素表明了支持HTTP/1.1協議的鏈接器組件,使Catalina成爲一個可以執行servlet和JSP頁面的獨立的Web服務器。一個HTTP 鏈接器組件的實例監聽服務器上一個特定的TCP端口號上的鏈接。一個或多個這樣的鏈接器能夠配置成一個單一Service的一部分,每一個轉發到相關聯的Engine 處理請求,並建立響應。java

若是你要配置的鏈接器,用於鏈接到Web服務器使用的的AJP協議(如 mod_jk的1.2.x的鏈接器適用於Apache 1.3),請參閱 AJPConnector文檔。web

每一個進入的請求須要一個線程處理。若是接收到比當前可用的請求處理線程能夠處理更多的併發請求,將建立額外的線程直到達到所配置的最大線程數(maxThreads值)。若是有超過處理能力的更多的請求到來,它們將被堆積在鏈接器建立的服務器套接字內,直到達到配置中acceptCount 的最大值。任何更多的同步請求將收到「鏈接被拒絕」的錯誤,直到有空閒線程來處理它們。正則表達式

2 屬性

2.1 公共屬性

全部的鏈接器實現 支持如下屬性:算法

屬性apache

描述api

allowTrace數組

一個布爾值,它能夠用來啓用或禁用跟蹤HTTP方法。若是沒有指定,該屬性設置爲false。瀏覽器

asyncTimeout緩存

默認超時時間以毫秒爲單位的異步請求。若是沒有指定,該屬性被設置爲10000(10秒)。

enableLookups

若是你想request.getRemoteHost()的調用 執行,以便返回的遠程客戶端的實際主機名的DNS查詢,則設置爲true。設置爲false跳過DNS查找,並返回字符串形式的IP地址(從而提升性能)。默認狀況下,禁用DNS查找。

maxHeaderCount

容器容許的請求頭字段的最大數目。請求中包含比指定的限制更多的頭字段將被拒絕。值小於0表示沒有限制。若是沒有指定,默認設置爲100。

maxParameterCount

將被容器自動解析的最大數量的參數和值對(GET加上POST)。參數值對超出此限制將被忽略。值小於0表示沒有限制。若是沒有指定,默認爲10000。請注意, FailedRequestFilter 過濾器能夠用來拒絕達到了極限值的請求。

maxPostSize

將被容器以FORM URL參數形式處理的最大長度(以字節爲單位)的POST。經過設置此屬性的值小於或等於0能夠禁用該限制。若是沒有指定,該屬性被設置爲2097152(2兆字節)。

maxSavePostSize

將被容器在FORM或CLIENT-CERT認證中保存/緩衝的POST的最大尺寸(以字節爲單位)。對於這兩種類型的身份驗證,在用戶身份驗證以前,POST將被保存/緩衝。對於POST CLIENT-CERT認證,處理該請求的SSL握手和緩衝清空期間,POST將被緩存。對於Form認證,POST將被保存,同時用戶將被重定向到登錄表單。POST將被一直保留直到用戶成功認證或者認證請求關聯的會話超時。將此屬性設置爲-1能夠禁用此限制。將此屬性設置爲0,POST數據在身份驗證過程當中將不被保存。若是沒有指定,該屬性設置爲4096(4千字節)。

parseBodyMethods

以逗號分隔的HTTP方法列表,經過方法列表,等同於POST方法,request 正文將被解析成請求參數。這在RESTful應用程序要支持以POST式的語義解析PUT請求中是很是有用的。須要注意的是設置其餘值(不是POST)會致使Tomcat的行爲違反servlet規範的目的。在這裏爲了符合HTTP規範明確禁止HTTP方法TRACE。默認值是POST

port

TCP端口號,鏈接器利用該端口號將建立一個服務器套接字,並等待傳入的鏈接。你的操做系統將只容許一個服務器應用程序在一個特定的IP地址偵聽特定的端口號。若是使用特殊值0(零),則Tomcat將爲鏈接器隨機選擇一個空閒的端口。這是一般只用在嵌入式和測試應用程序。

protocol

設置協議來處理傳入流量。默認值是 HTTP/1.1,將使用自動切換機制來選擇阻塞的基於Java的鏈接器或APR /native 爲基礎的鏈接器。若是PATH(Windows)或LD_LIBRARY_PATH(在大多數Unix系統)的環境變量包含在Tomcat的本地庫裏,APR /native 鏈接器將被使用。若是在本地庫中沒法找到,阻斷基於Java的鏈接器將被使用。須要注意的是使用HTTPS比Java鏈接器與APR /native 鏈接器有不一樣的設置。一個明確的協議,而不是依靠上述自動切換機構,可用如下值:

org.apache.coyote.http11.Http11Protocol -阻塞式的Java鏈接器org.apache.coyote.http11.Http11NioProtocol -不阻塞Java鏈接器org.apache.coyote.http11.Http11AprProtocol -的APR / native 鏈接器

 也可使用的用戶自定義的實現。看一看在咱們的鏈接器比較圖。Java鏈接器,HTTP和HTTPS,配置是相同的。 APR鏈接器和APR特定的SSL設置的更多信息,請訪問APR文檔

proxyName

若是這個鏈接正在使用的代理服務器配置,配置該屬性指定的服務器的名稱,能夠調用request.getServerName()返回。有關更多信息,請參見代理支持

proxyPort

若是這個鏈接正在使用的代理服務器配置,配置該屬性指定服務器端口,能夠調用request.getServerPort()返回。有關更多信息,請參見代理支持

redirectPort

若是該鏈接器支持非SSL請求,而且接收到的請求爲知足安全約束須要SSL傳輸, Catalina 將自動將請求重定向到指定的端口號。

scheme

將該屬性設置爲你想調用request.getScheme()返回的協議的名稱。例如,對於SSL鏈接器,你會將此屬性設置爲「HTTPS 」。默認值是「 HTTP 」。

secure

若是你想調用request.isSecure()收到此鏈接器的請求返回true,請該該屬性設置爲true。您但願SSL鏈接器或非SSL鏈接器接收數據經過一個SSL加速器,像加密卡,SSL設備,甚至一個web服務器。默認值是假的

URIEncoding

這將指定使用的字符編碼,來解碼URI字符。若是沒有指定,ISO-8859-1將被使用。

useBodyEncodingForURI

這指定是否應該用於URI查詢參數,而不是使用URIEncoding contentType中指定的編碼。此設置兼容性Tomcat 4.1.x版(該版在contentType中指定編碼,或者使用request.setCharacterEncoding的方法顯式設置(參數爲URL傳來的值)。默認值false。

useIPVHosts

將該屬性設置爲true會致使Tomcat使用收到請求的IP地址,來肯定將請求發送到哪一個主機。默認值是假的

xpoweredBy

將此屬性設置爲true會致使Tomcat支持使用Servlet規範的通知,(在規範中推薦使用頭字段)。默認值是假的

2.2 標準實現

除了上面列出的常見的鏈接器屬性,標準的HTTP鏈接器(BIONIOAPR/native)都支持如下屬性。 

屬性

描述

acceptCount

當全部可能的請求處理線程都在使用時,傳入鏈接請求的最大隊列長度。當隊列滿時收到的任何請求將被拒絕。默認值是100

acceptorThreadCount

用於接受鏈接的線程的數量。在一個多CPU的機器上,增長該值,雖然你可能不會真正須要超過2個。此外,有不少非保持活動鏈接,您可能須要增長這個值。默認值是 1

acceptorThreadPriority

接收器線程的優先級。該線程用來接受新的鏈接。默認值是5java.lang.Thread.NORM_PRIORITY常量)。更多這個優先級是什麼意思的詳細信息,請查看java.lang.Thread的類的JavaDoc 

address 

對於擁有多個IP地址的服務器,該屬性指定哪一個地址將被用於在指定端口上監聽。默認狀況下,該端口將被用於與服務器相關聯的全部IP地址。

bindOnInit

控制鏈接器綁定時套接字的使用。缺省狀況,當鏈接器被啓動時套接字被綁定和當鏈接器被銷燬時套接字解除綁定。若是設置爲false,鏈接器啓動時套接字被綁定,鏈接器中止時套接字解除綁定。

compressableMimeType

該值是一個被用於HTTP壓縮的逗號分隔的MIME類型列表。默認值是text / html類型,爲text / xmltext / plain

compression 

爲了節省服務器帶寬,鏈接器可使用HTTP/1.1 GZIP壓縮。可接受的參數的值是「off 」(禁用壓縮),「on 」(容許壓縮,這會致使文本數據被壓縮),「force 」(強制在全部的狀況下壓縮),或者一個整數值(這是至關於爲「on」,但指定了輸出以前被壓縮的數據最小量)。若是不知道內容長度但被設置爲「on」或更積極的壓縮,輸出的數據也將被壓縮。若是沒有指定,該屬性被設置爲

注意:這是使用壓縮(節省您的帶寬)和使用sendfile功能(節省你的CPU週期)之間的權衡。若是鏈接器支持sendfile功能,例如NIO鏈接,則使用sendfile將優先於壓縮。症狀是48 KB的靜態文件將未壓縮就發送。你能夠以下文所述經過設置鏈接器的useSendfile屬性來關閉sendfile,或在默認的conf/web.xml或者你的web應用的web.xml中配置DefaultServlet來改變sendfile的使用量閾值。

compressionMinSize

若是壓縮被設置爲「on」,那麼該屬性能夠用於指定在輸出以前被壓縮的數據的最小量。若是未指定,此屬性默認爲「2048」

connectionLinger

鏈接器的套接字被關閉時的逗留秒數。若是沒有指定,將使用默認的JVM

connectionTimeout 

在將提交的請求URI行呈現以後,鏈接器將等待接受鏈接的毫秒數。使用值-1表示沒有超時(即無限)。默認值是6000060秒),但請注意,Tomcat的標準server.xml中,設置爲20000(即20秒)。

connectionUploadTimeout

上傳數據過程當中,指定的以毫秒爲單位超時時間。只有在設置disableUploadTimeoutfalse有效。

disableUploadTimeout

此標誌容許servlet容器在數據上傳時使用不一樣的鏈接超時,一般較長。若是沒有指定,該屬性被設置爲true,禁用上傳超時。

executor 

指向Executor元素的引用。若是這個屬性被設置,而且被命名的executor存在,鏈接器將使用這個executor,而其餘全部線程相關屬性將被忽略。請注意共享的executor若是沒有指定到一個鏈接器,則該鏈接器將使用一個私有的,內部的executor來提供線程池。

KeepAliveTimeout

此鏈接器在關閉鏈接以前將等待另外一個HTTP請求的毫秒數。默認值是使用已設置的connectionTimeout屬性的值。使用值-1表示沒有超時(即無限)。

maxConnections

在任何給定的時間服務器接受並處理的最大鏈接數。當這個數字已經達到了,服務器將不會接受任何鏈接,直到鏈接的數量降到低於此值。基於acceptCount的設置,操做系統可能仍然接受鏈接。默認值根據不一樣的鏈接器類型而不一樣。對於BIO,默認的是maxThreads的值,除非使用了Executor,在這種狀況下默認值是executormaxThreads 。對於NIO的默認值是10000APR /native的默認值是8192

須要注意的是Windows系統的APR/native,所配置的值將減小到小於或等於maxConnections1024的倍數的最大值。這樣作是出於性能方面的考慮。

若是設置的值-1maxConnections功能被禁用,並且鏈接數將不作計算。

maxHttpHeaderSize

請求和響應的HTTP頭的(以字節爲單位的)最大尺寸。若是沒有指定,該屬性被設置爲81928 KB)。

maxKeepAliveRequests

HTTP請求最大長鏈接個數。將此屬性設置爲1,將禁用HTTP/1.0、以及HTTP/1.1的長鏈接。設置爲-1,不由用。若是沒有指定,該屬性被設置爲100

maxThreads 

最多同時處理的鏈接數,Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。若是沒有指定,該屬性被設置爲200。若是使用了execute將忽略此鏈接器的該屬性,鏈接器將使用execute,而不是一個內部線程池來處理請求。

maxTrailerSize

限制一個分塊的HTTP請求中的最後一個塊的尾隨標頭的總長度。若是該值是-1,沒有限制的被強加。若是沒有指定,默認值是8192

minSpareThreads

始終保持運行最小線程數。若是沒有指定,則默認爲10

noCompressionUserAgents

該值是一個正則表達式(使用java.util.regex),匹配不該該使用壓縮的HTTP客戶端的用戶代理標頭。由於這些客戶端,雖然他們宣稱支持壓縮功能,但實現不完整。默認值是一個空字符串(正則表達式匹配禁用)。

processorCache

協議處理器緩存Processor對象以提升性能。此設置規定了這些對象有多少能獲得緩存。-1意味着無限制,默認爲200。若是不使用Servlet 3.0的異步處理,一個好的默認是使用maxThreads設置。若是使用Servlet 3.0的異步處理,一個好的默認是使用maxThreads和最大預期的併發請求(同步和異步)的最大值中的較大值。

restrictedUserAgents

該值是一個正則表達式(使用java.util.regex),匹配用戶代理頭的HTTP瀏覽器將不能使用HTTP/1.1HTTP/1.0長鏈接,即便該瀏覽器宣稱支持這些功能的。默認值是一個空字符串(正則表達式匹配禁用)。

server 

覆蓋服務器的HTTP響應頭。若是設置了這個屬性的值將覆蓋Web應用程序設置的Tomcat的默認頭和任何服務器頭。若是沒有設置,應用程序指定的任何值將被使用。若是應用程序沒有指定一個值,那麼Apache-Coyote/1.1將被使用。除非你是偏執狂,你將再也不須要此功能。

socketBuffer

爲套接字輸出緩衝而提供的緩衝區的大小(以字節爲單位)。-1能夠被指定來禁止使用的緩衝區。默認狀況下,一個9000個字節的緩衝區將被使用。

SSLEnabled 

在鏈接器上使用此屬性來啓用SSL加密傳輸。若是要打開SSL握手/加密/解密,請設置true。默認值是false。當設置這個值爲true時,爲了傳遞正確的request.getScheme()和 request.isSecure()到servlets,你須要設置schemesecure屬性。更多信息請查看SSL支持

tcpNoDelay 

若是設置爲trueTCP_NO_DELAY選項將被設置在服務器上的套接字上,在大多數狀況下,這樣能夠提升性能。默認設置爲true

threadPriority 

JVM中請求處理線程的優先級。默認值是5java.lang.Thread.NORM_PRIORITY常量值)。關於優先級的更多詳細信息,請查看java.lang.Thread的類的JavaDoc 

2.3 Java TCP套接字的屬性

除了上文列出的通用的鏈接器和HTTP屬性,BIONIO實現還支持下面的JavaTCP套接字屬性。

屬性

描述

socket.rxBufSize

int)套接字接收緩衝區(SO_RCVBUF)大小(以字節爲單位)。若是沒有設置,JVM默認值將被使用。

socket.txBufSize

int)套接字發送緩衝區(SO_SNDBUF)大小(以字節爲單位)。若是沒有設置,JVM默認值將被使用。

socket.tcpNoDelay

bool)至關於到標準屬性 tcpNoDelay

socket.soKeepAlive

bool)套接字的長鏈接(SO_KEEPALIVE)設置。若是沒有設置,JVM默認值將被使用。

socket.ooBInline

bool)套接字的OOBINLINE設置。若是沒有設置,JVM默認值將被使用。

socket.soReuseAddress

bool)套接字複用地址選項(SO_REUSEADDR)。若是沒有設置,JVM默認值將被使用。

socket.soLingerOn

bool)套接字的延遲關閉選項(SO_LINGER)。標準屬性connectionLinger> = 0 的時候,至關於將此項設置爲true。標準屬性connectionLinger<0 的時候,至關於將此項設置爲false。此屬性和soLingerTime都必須被設置,不然JVM的預設值將被使用。

socket.soLingerTime

int)套接字延時關閉選項(SO_LINGER)秒數。這至關於標準屬性connectionLinger。此屬性和soLingerOn都必須被設置,不然JVM的預設值將被使用。

socket.soTimeout

至關於標準屬性 connectionTimeout

socket.performanceConnectionTime

int)性能設置的第一個值。 全部這三個性能屬性必須設置不然全部三個屬性的JVM預設值將被使用,可查看套接字性能選項

socket.performanceLatency

int)性能設置的第二個值。 全部這三個性能屬性必須設置不然全部三個屬性的JVM預設值將被使用,可查看套接字性能選項

socket.performanceBandwidth

int)性能設置的第三個值。 全部這三個性能屬性必須設置不然全部三個屬性的JVM預設值將被使用,可查看套接字性能選項

socket.unlockTimeout

int)套接字解鎖的超時時間。當一個鏈接器中止時,它會經過打開一個鏈接到自己的鏈接器來嘗試釋放acceptor 線程。默認值是250(以毫秒爲單位)

2.4 BIO的具體配置

下面是BIO鏈接器的特定屬性。

屬性

描述

disableKeepAlivePercentage

爲提升可擴展性,在長鏈接失效以前被使用的處理線程的百分比。小於0的值將被設爲0,大於100的值將被設爲100。若是沒有指定,默認值是75

 2.5 NIO的具體配置

下面是NIO鏈接器的特定屬性。

屬性

描述

pollerThreadCount

int)用來處理輪詢事件的線程的數量。在版本7.0.27及之前版本,默認值是每一個處理器1個。版本7.0.28的默認值是每一個處理器1個,但不超過2個。

當接受一個套接字,操做系統擁有全局的鎖。因此超過2個線程的好處而迅速減少。有一個以上的線程是由於系統須要很是迅速地接受鏈接。但一般只要增長acceptCount值就能夠解決這個問題。增長該值也多是有用的,當大量發送文件操做發生的時候。

pollerThreadPriority

int)輪詢線程的優先級。默認值是5java.lang.Thread.NORM_PRIORITY常量值)。優先級的更多詳細信息,能夠查考java.lang.Thread類的JavaDoc 

selectorTimeout

int)選擇輪詢器select()的超時時間(以毫秒爲單位)。這個值很是重要,由於鏈接清理工做也是在同一個線程裏的,因此不要將此值設置爲一個很是高的。默認值是1000毫秒。

useComet

bool)是否容許Comet servlet。默認值是 true

useSendfile

bool)使用此屬性來啓用或禁用sendfile的能力。默認值是true

socket.directBuffer

bool)選擇使用直接ByteBuffersJava映射的ByteBuffers。默認是false
當您使用直接ByteBuffers,請確保你分配適當的內存量給直接內存空間。在SunJDK中,配置如-XXMaxDirectMemorySize = 256M

socket.appReadBufSize

int)在Tomcat中每一個鏈接的開闢鏈接一個讀ByteBuffer。此屬性控制這個緩衝區的大小。默認狀況下,這個讀緩衝區大小爲8192字節。對於較低的併發,你能夠增長這個值以緩衝更多的數據。對於長鏈接數不少的狀況,你須要下降這個數值或者增長堆大小。

socket.appWriteBufSize

int)在Tomcat中每一個鏈接的開闢鏈接一個寫ByteBuffer。此屬性控制這個緩衝區的大小。默認狀況下,這個寫緩衝區大小爲8192字節。對於較低的併發,你能夠增長這個值以緩衝更多的響應數據。對於長鏈接數不少的狀況,你須要下降這個數值或者增長堆大小。
這裏的默認值是至關低的,若是面對的不是幾萬併發鏈接,你應該增大該值。

socket.bufferPool

intNIO鏈接器使用NioChannel這個類來持有連接到一個套接字的元素。爲了減小垃圾收集,NIO鏈接器緩存這些通道的對象。此值指定這個緩存的大小。默認值是500,表示緩存將持有500 NioChannel的對象。-1表示不限制緩存大小,0表示不緩存。

socket.bufferPoolSize

intNioChannel池,也能夠是基於尺寸大小,而不是基於對象數的。該大小的計算以下:
NioChannel
的緩衝區大小=讀取緩衝區大小+寫入緩衝區大小
SecureNioChannel
的緩衝區大小=應用程序讀取緩衝區大小+應用程序寫入緩衝區的大小+網絡讀取緩衝區大小+網絡寫入緩衝區的大小

值(以字節爲單位),默認值1024 * 1024 * 100 100MB)。

socket.processorCache

int)以減小垃圾收集,Tomcat緩存SocketProcessor對象。該值指定保持在緩存中最多有多少個對象。默認值是500-1表示不限制緩存大小,0表示不緩存。

socket.keyCache

int)以減小垃圾收集,Tomcat緩存KeyAttachment對象。該值指定保持在緩存中最多有多少個對象。默認值是500-1表示不限制緩存大小,0表示不緩存。

socket.eventCache

int)以減小垃圾收集,Tomcat緩存PollerEvent對象。該值指定保持在緩存中最多有多少個對象。默認值是500-1表示不限制緩存大小,0表示不緩存。

selectorPool.maxSelectors

int)以減小選擇器的爭用,在池中使用的選擇器最大個數。命令行org.apache.tomcat.util.net.NioSelectorShared值設置爲false時,使用此選項。默認值是200

selectorPool.maxSpareSelectors

int)以減小選擇器的爭用,在池中使用的最大備用選擇器個數。當選擇器返回到池中時,系統能夠決定保留它或者讓他垃圾回收。當org.apache.tomcat.util.net.NioSelectorShared 值設置爲false時,使用此選項。默認值是-1(無限制)。

命令行選項

下面的命令行選項可用於NIO鏈接器:-Dorg.apache.tomcat.util.net.NioSelectorShared=true|false

 默認狀況下是true。若是你想每一個線程使用一個選擇器,將此值設置爲false。當你將它設置爲false,你能夠經過使用selectorPool.maxSelectors屬性控制選擇器池的大小。

oomParachute

intNIO鏈接器實現了一個名叫parachuteOutOfMemoryError錯誤的策略。它擁有一個塊的數據做爲一個字節數組。在一個OOM的狀況下,這個數據塊被釋放,並報告錯誤。這會給VM足夠的空間來清理。oomParachute表明parachute(字節數組)的大小(以字節爲單位)。默認值是 1024 * 10241MB)。請注意,這僅適用於關於Java堆空間的OOM錯誤,也不是絕對保證,你將可以恢復全部。若是你有一個Java堆以外OOM的,那麼這個parachute也無濟於事。

2.6 APR /Native 的具體配置

下面是APR/Native 鏈接器的特定屬性。

屬性

描述

deferAccept

在鏈接器的監聽套接字上設置TCP_DEFER_ACCEPT標誌。當操做系統支持TCP_DEFER_ACCEPT時默認值是true,不然它是false。

pollerSize

在一個給定的時間內,負責長鏈接輪詢的輪詢器可以持有的線程數。額外的鏈接將被立刻關閉。默認值是8192,與8192個長鏈接數一致。是maxConnections的一個代名詞。

pollerThreadCount

用於輪詢長鏈接的線程數。Windows系統默認選擇,每一個線程管理的套接字數小於1024。對於Linux的默認值是1。更改Windows下的默認值可能有負面的性能影響。

pollTime

輪詢調用持續的時間(以微秒爲單位)。在某些狀況下,下降該值將略微減小潛在的鏈接數,但隨着增長的輪詢調用會使用更多的CPU。默認值是2000(毫秒)。

sendfileSize

在給定時間內,負責異步發送靜態文件的輪詢器能夠持有的套接字數。額外的鏈接將被立刻關閉,沒有任何數據被髮送(在客戶端產生一個長度爲零的文件)。請注意,在大多數狀況下,的sendfile是一個馬上返回的調用(被內核照顧的「同步」),並且sendfile輪詢器將不會被使用,因此能夠同時發送的靜態文件的數量大於指定的值。默認值是1024。

sendfileThreadCount

服務於sendfile套接字的線程數。因爲Windows系統默認選擇,每一個線程管理的套接字小於1024。Linux系統的默認值是1。更改Windows系統下的默認值可能有負面的性能影響。

threadPriority

(int)接收器和輪詢器線程的優先級。默認值是5(java.lang.Thread.NORM_PRIORITY常量值)。優先級的詳細信息請查看java.lang.Thread類的JavaDoc 。

useComet

(bool)容許或禁止Comet servlet。默認值是 true。

useSendfile

(bool)使用此屬性來啓用或禁用sendfile的能力。默認值是true。

3 嵌套組件

這個時候沒有。

4 特殊功能

4.1 HTTP/1.1和HTTP/1.0的支持

鏈接器支持在RFC 2616中描述的HTTP/1.1協議的全部必需功能,包括持久鏈接,管道,預期和分塊編碼所需的功能。若是客戶端(一般是瀏覽器)只支持HTTP/1.0, 鏈接器將優雅地向下兼容以支持該協議。啓用這種支持,沒有特殊的配置要求。該鏈接器還支持HTTP/1.0長鏈接。

RFC 2616規定,HTTP服務器老是在它們響應的開頭加上它們宣稱支持的最高的HTTP版本。所以,此 鏈接器將老是在其響應開頭返回HTTP/1.1。

4.2 代理支持

當Tomcat部署在代理服務器的後面的時候,proxyName和proxyPort屬性能夠被使用。這些屬性修改web服務器調用的request.getServerName()和request.getServerPort() 方法的值,這是常常被用來構造重定向de 絕對路徑的URL。若是不配置這些屬性,返回的值將反映代理服務器接收鏈接的服務器名稱和端口,而不是客戶端定向原始請求的服務器名稱和端口。

有關詳細信息,請參閱 如何使用代理服務器支持

4.3 SSL支持

經過設置啓用SSL屬性爲true,您能夠啓用SSL支持此鏈接器的特定實例 。

你還須要設置scheme 和secure  屬性的值分別爲https和true,傳遞正確的信息到servlet。

BIO與NIO鏈接器使用JSSE的SSL,而APR / native鏈接器使用OpenSSL。所以,除了使用不一樣的屬性來配置SSL的APR / native鏈接器外,還須要以不一樣的格式提供密鑰和證書。

有關詳細信息,請參閱文檔SSL怎麼配置

4.3.1 SSL支持-BIO與NIO

BIO與NIO鏈接器使用下面的屬性來配置SSL:

屬性

描述

algorithm

使用的證書編碼算法。默認 KeyManagerFactory.getDefaultAlgorithm()返回 Sun JVM的SunX509。IBM的JVM返回 IbmX509。對於其餘廠商,請參閱JVM文檔的默認值。

allowUnsafeLegacyRenegotiation

容許不安全的傳統的TLS從新協商,它有可能容許暴露用戶給CVE-2009-3555(處理會話重協商過程當中TLS實現存在錯誤,容許經過中間人攻擊,注入任意明文到已存在的TLS會話中。)的狀況發生。若是沒有指定,默認設置爲false。此屬性只對不支持RFC 5746(代表僞密碼套件TLS_EMPTY_RENEGOTIATION_INFO_SCSV的存在)的JVM有用。JRE / JDK 6update 22起,這是可用的。支持RFC 5746的從新談判-包括支持不安全的傳統從新談判-是由JVM配置控制的。

ciphers

逗號分隔的這個套接字被容許使用的加密算法列表。默認狀況下,在JVM的默認密碼將被使用。請注意,這一般意味着,弱輸出等級的密碼將被包含在列表的可用密碼中。密碼被指定使用JSSE密碼的命名約定。特殊值ALL ,將啓用全部支持的密碼。這將包括許多不安全。ALL僅用於測試目的。

clientAuth

若是在接受鏈接以前,你想讓從客戶端來的SSL協議棧須要一個有效的證書鏈則設置爲true。若是你想讓SSL協議棧須要一個客戶端證書,設置爲want,但若是沒有提供將不會失敗。設置爲false值(這是默認的)將不須要證書鏈,除非客戶端請求採用CLIENT-CERT認證的安全約束保護的資源。

clientCertProvider

當客戶端證書信息的以表單形式而不是java.security.cert.X509Certificate實例形式提供時,須要轉換以後纔可使用,此屬性控制哪一個JSSE提供者來執行轉換。例如,它是關聯AJP鏈接器,HTTP APR 鏈接器和 org.apache.catalina.valves.SSLValve。若是沒有指定,默認的provider 將被使用。

crlFile

用來驗證客戶端證書的證書吊銷列表。若是沒有定義,將不覈對證書吊銷列表來檢查客戶端證書。

keyAlias

用於作key庫中的服務器證書的別名。若是沒有指定將使用在key庫中讀取的第一個key。

keypass

該密碼用於訪問指定的keystore文件的服務器證書。默認值是「changeit」。

keystoreFile

要加載的服務器證書存放的keystore文件的路徑名。默認狀況下,該文件的路徑名是「 .keystore」,在操做系統中運行Tomcat的用戶的home 目錄。若是您的keystoreType不須要文件則能夠將keystoreFile設置爲「」(空字符串)。

keystorePass

該密碼用於訪問指定的keystore文件。默認值是keypass屬性值。

keystoreProvider

被用於服務器證書的keystore 提供者的名稱。若是未指定,將選擇按優先順序註冊過的提供者列表的第一個支持keystoreType的提供者。

keystoreType

用於服務器證書的keystore文件的類型。若是沒有指定,默認值是「JKS」。

sessionCacheSize

保持在session緩存中的SSL會話的數量。使用0到指定一個無大小限制的緩存。若是沒有指定,默認值爲0。

sessionTimeout

在建立一個SSL會話後它將超時的時間(以秒爲單位)。使用0指定無限制超時。若是沒有指定,默認爲86400(24小時)。

sslEnabledProtocols

使用的SSL協議的列表。若是未指定,則使用JVM的默認設置。

sslImplementationName

使用的SSL實現的類名。若是未指定, 將使用默認的org.apache.tomcat.util.net.jsse.JSSEImplementation它封裝了JVM的默認JSSE提供者。須要注意的是,JVM能夠被配置爲使用不一樣的JSSE提供者做爲默認值。

sslProtocol

使用的SSL協議版本。若是沒有指定,默認是「 TLS」。

trustManagerClassName

一個用來驗證客戶端證書的自定義信任管理類的名稱。這個類必須有一個無參數的構造並且必須實現javax.net.ssl.X509TrustManager。若是設置了這個屬性,trust store相關屬性將被忽略。

trustMaxCertLength

驗證客戶端證書時,容許的中間證書的最大數量。若是沒有指定,默認值5將被使用。

truststoreAlgorithm

該算法用於truststore。若是沒有指定,將使用由javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm()返回 的默認值。

truststoreFile

用來驗證客戶端證書的trust store文件。默認值是javax.net.ssl.trustStore系統屬性。若是既沒有此屬性又沒有默認的系統屬性設置,則不配置trust store。

truststorePass

訪問trust store的密碼。默認值是javax.net.ssl.trustStorePassword系統屬性。若是該屬性是空的,沒有trust store密碼將被配置。若是指定了一個無效的trust store密碼,將會記錄警告,並試圖沒有密碼訪問trust store,這將跳過驗證trust store的內容。

truststoreProvider

用於服務器證書的truststore提供者的名稱。默認值是javax.net.ssl.trustStoreProvider系統屬性。若是該屬性爲空,將使用keystoreProvider做爲默認值。若是既沒有這個屬性,也沒有默認的keystoreProvider系統屬性,按優先順序遍歷已註冊提供者列表,選擇使用支持 truststoreType第一個提供者。

truststoreType

用於trust store的key store的類型。默認值是javax.net.ssl.trustStoreType系統屬性。若是該屬性爲空,則keystoreType做爲默認值。

4.3.2 SSL支持 - APR /Native

APR / Native啓用時,HTTPS鏈接器將使用一個套接字來輪詢長鏈接,以提升服務器的可擴展性。它還使用OpenSSL,這可能比JSSE更優化(取決於所使用的處理器),而且能夠補充許多商業加速器組件。不一樣於HTTP鏈接器,HTTPS鏈接器不能使用的sendfile優化靜態文件的處理。

HTTPS APR / Native鏈接器具備HTTP APR / Native鏈接器相同的屬性,而且增長了OpenSSL的特殊屬性。使用OpenSSL的全部詳細資料,請參閱OpenSSL資料和許多可用的書籍(請參閱官方OpenSSL的網站)。SSL特有的APR /Native鏈接器的屬性:

屬性

描述

SSLCACertificateFile

查看mod_ssl的文檔

SSLCACertificatePath

查看mod_ssl的文檔

SSLCARevocationFile

查看mod_ssl的文檔

SSLCARevocationPath

查看mod_ssl的文檔

SSLCertificateChainFile

查看mod_ssl的文檔

SSLCACertificateFile

包含受信任的證書頒發機構的拼接的證書文件的名稱。是PEM編碼的格式。

SSLCACertificatePath

包含的受信任的證書頒發機構的證書目錄名稱。是PEM編碼的格式。

SSLCARevocationFile

包含證書頒發機構的拼接的證書吊銷列表文件的名稱。是PEM編碼的格式。

SSLCARevocationPath

包含的證書頒發機構的拼接的證書撤銷列表的目錄的名稱。是PEM編碼的格式。

SSLCertificateChainFile

包含鏈接的certifcates造成的資格證書鏈的服務器證書的證書頒發機構的的文件的名稱。是PEM編碼的格式。

SSLCertificateFile

包含服務器證書的文件的名稱。是PEM編碼的格式。

SSLCertificateKeyFile

包含服務器私鑰的文件名稱。是PEM編碼的格式。默認值是SSLCertificateFile的值,在這種狀況下,證書和私鑰都必須在這個文件中(不推薦)。

SSLCipherSuite

可用於與客戶端進行通訊的密碼。默認值是「ALL」,其餘可接受的值是以「:」分隔的一組密碼,(請參閱OpenSSL的文檔列表中支持的密碼)。

SSLHonorCipherOrder

設置爲true(這是默認值)將強制服務器的密碼規則(按照SSLCipherSuite設置),而不容許客戶端選擇密碼。

SSLPassword

用於私有密鑰加密的口令短語。若是沒有提供「SSLPassword」時,回調函數將提示輸入口令短語。

SSLProtocol

可被用來與客戶端通訊的協議。默認值是all,這是等同的SSLv3 +的TLSv1,其餘可接受的值是 SSLv2, SSLv3,TLSv1以及用加號鏈接起來的三個協議的任意組合。請注意,SSLv2協議 本質上是不安全的。

SSLVerifyClient

向客戶端要求證書。默認值是「none」,這意味着客戶端將不會有機會提交證書。其餘可接受的值包括「optional」,「require」和「optionalNoCA」。

SSLVerifyDepth

客戶端證書的最大驗證深度。默認值是「10」。

4.4鏈接器的比較

下面是一個小的圖表,顯示了鏈接器如何區分。

Java Blocking Connector  BIO

Java Non Blocking Connector  NIO

APR/native Connector   APR


Classname

Http11Protocol

Http11NioProtocol

Http11AprProtocol

Tomcat Version

3.x onwards

6.x onwards

5.5.x onwards

Support Pollin

NO

YES

YES

Polling Size

N/A

maxConnections

maxConnections

Read HTTP Request

Blocking

Non Blocking

Blocking

Read HTTP Body

Blocking

Sim Blocking

Blocking

Write HTTP Response

Blocking

Sim Blocking

Blocking

Wait for next Request

Blocking

Non Blocking

Non Blocking

SSL Support

Java SSL

Java SSL

OpenSSL

SSL Handshake

Blocking

Non blocking

Blocking

Max Connections

maxConnections

maxConnections

maxConnections

相關文章
相關標籤/搜索