Tomcat Connector connectionTimeout含義和驗證


1. Tomcat配置

今天小戚發出一封郵件,說因為線上系統中tomcat的連接超時(connectionTimeout)設置成60ms,造成第三方訪問公司的服務,總是502異常。

這個設置在$tomcat/conf/server.xml中

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="2000" disableUploadTimeout="true" />

2. 測試一下這個超時的含義

http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

connectionTimeout :

  • 單位是毫秒,Connector從接受連接到提交URI的等待的時間。

The number of milliseconds this Connector will wait, after accepting a connection, for the request URI line to be presented. The default value is 60000 (i.e. 60 seconds).

以上中文是經過如下分析過程得出的。

 

2.1. 是否是整個連接處理的時間?

寫了一個servlet,doGet先sleep一段時間,再寫一個輸出,直接用瀏覽器訪問。

經過測試,發現和這個時間無關。

 

2.2. 用HttpURLConnection做測試

寫客戶端模擬超時,可能是因為API直接實現到提交URI了,另外還懷疑底層有自動保持連接的動作,反正怎么Sleep都不超時,得換個寫法了。

明天連上TCPMon看看后台有沒有自動保持連接的動作。

        def sURL='http://localhost:8080/index.jsp'
URL url = new URL(sURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

2.3. 用telnet收工測試

直接用telnet連上tomcat,如果什么都不輸入,socket很快回斷開,輸入完整GET。。。,能夠獲得輸出。如果不保持輸入,則連接很快會斷開。如果一直不停輸入,連接繼續保持。

$ telnet localhost 8080

GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.53
Content-Length: 36

2.4. 直接寫Socket做測試

還是2s超時,睡一秒能夠正確獲得輸出,睡2秒,輸出為空。

以下是Groovy代碼

content ='''GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.53
Content-Length: 36

'''
def sleepTime=1000
Socket socket = new Socket('localhost',8080)

println 'is keep alive? ' + socket.getKeepAlive()

println 'sleep ' + sleepTime + ' ms.'
Thread.sleep(sleepTime)
println 'is closed? ' + socket.isClosed()

println 'sleep ' + sleepTime + ' ms.'
//Thread.sleep(sleepTime)

println 'write socket begin======'
writeStream(content, socket.getOutputStream())

println 'read socket begin======'
println readStream(socket.getInputStream())[0..300]

void writeStream(content, stream) {
OutputStream buf = new BufferedOutputStream(stream);
OutputStreamWriter out = new OutputStreamWriter(buf, "UTF-8");
out.write(content)
out.flush();
print content
//out.close();
}

String readStream(stream){
String sResult=''
byte[] buffer = new byte[1024];

int readCount = stream.read(buffer);

while (readCount != -1) {
sResult += new String(buffer, 0,
readCount, "utf-8");
readCount = stream.read(buffer);
}
stream.close()
return sResult
}

用Groovy寫測試代碼真舒服,呵呵。

 

 
 
 
 
 
 

JBoss使用Tomcat作為Web容器,因此在JBoss中對於Web容器的配置也類似於在Tomcat中的配置,主要就是對於server.xml文件的編輯,在JBoss 5.x中,這個文件位於${JBOSS.HOME}\server\${confifure}\deploy\jbossweb.sar下,其中configure的值可以是all,
default,web,standard, minimal等。下面的代碼展示了一個JBoss default配置下的server.xml,由於篇幅原因,將其中的注釋都已經去掉了。

<Server> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Service name="jboss.web"> <Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}"  connectionTimeout="20000" redirectPort="8443" compression="on"  compressionMinSize="1" compressableMimeType="text/html,text/xml" /> <Engine name="jboss.web" defaultHost="localhost"> <Realm className="org.jboss.web.tomcat.security.JBossWebRealm" certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping" allRolesMode="authOnly" /> <Host name="localhost">  <Valve className="org.jboss.web.tomcat.service.jca.CachedConnectionValve" cachedConnectionManagerObjectName="jboss.jca:service=CachedConnectionManager" transactionManagerObjectName="jboss:service=TransactionManager" /> </Host> </Engine> </Service> </Server> 

         在上面的配置文件中,Server是根節點,一個Server就代表一個Servlet容器,因此在server.xml中,這個節點只能有一個,在Server節點下,可以存在一個或者多個Service節點。

         一個Service節點代表了一個或者多個Connector和一個Engine,而Connector和Engine是在server.xml中兩個重要的配置項,Connector的主要功能是接受、響應用戶請求。常用的Connector有HTTP/1.1 Connector和AJP Connector,HTTP/1.1 Connector主要用於處理用戶的HTTP請求,需要注意的是雖然它名叫HTTP/1.1 Connector,但是是完全兼容HTTP/1.0協議的。AJP Connector主要使用AJP協議和Web
Connector通信,通常用於集群中。

         HTTP/1.1 Connector的實例監聽在用戶配置的端口上,當應用服務器啟動時,HTTP/1.1 Connector負責創建若干線程,用於處理用戶請求,創建的線程數目取決於用戶配置的minThreads值,默認為5,當有更多的用戶請求到來時,HTTP/1.1 Connector將會創建更多的線程用於處理請求,創建線程的最大值由maxThreads定義,默認值為20,當所有的線程都在忙於處理用戶請求時,新到來的請求將會放入HTTP/1.1 Connector創建的Socket隊列中,隊列的長度由acceptCount屬性定義,當等待隊列也被占用滿了,新來的用戶請求將會收到connection
refused錯誤。

         所有的Connector提供的配置項(不完全版scheme, isSecure, xpoweredBy, useIPVHosts ):

  • allowTrace 如果需要服務器能夠處理用戶的HAED/TRACE請求,這個值應該設置為true,默認值是false;
  • emptySessionPath 如果設置為true,所有session,cookie的path將會被設置為/,這種設置通常是在portlet中比較有用,默認值是false;
  • enableLookups 如果需要在調用request.getRemoteHost()方法時獲取到客戶端的機器名,則需要配置為true,如果配置為false,將會跳過DNS查詢直接返回客戶端機器的IP地址,通常為了提高性能,將此值設置為false,默認值是true;
  • maxPostSize POST方法能夠提交的數據的最大大小,如果沒有聲明或者設置為小於等於0,則表示POST提交的數據大小是不限制的,默認值是2Megabytes.
  • protocol 設置處理請求的協議,默認是HTTP/1.1,即org.apache.coyote.http11.Http11Protocol,此外還支持的協議有:org.apache.coyote.http11.Http11NioProtocol(通過NIO處理用戶請求,可以提高系統性能), org.apache.coyote.http11.HttpAprProtocol。
  • proxyName/proxyPort 如果Web服務器使用了代理服務器,配置此參數意味着在調用request.getServerName的時候將會獲取代理服務器的名稱,getServerPort()將會返回proxyPort。
  • redirectPort 如果Connector的配置是支持非SSL的請求,當一個SSL請求到來時,服務器會自動的將請求重定位到redirectPort。
  • URIEncoding URI字節轉化成String的時候的編碼方式,默認為ISO-8859-1,如果頁面需要支持中文,一般可以將其設置為UTF-8或者GBK,GB2312。
  • useBodyEncodingForURI 如果設置為true,則會根據頁面的編碼決定URI的編碼方式,默認是false。

   Http/1.1 Connector提供的配置項:

  • acceptCount 等待隊列的長度,默認值是100。
  • address 如果Tomcat所在的主機有多個IP,這個值聲明了用於監聽HTTP請求的IP地址。
  • bufferSize Connector創建的輸入流的大小,默認值是2048 bytes,提高這個值可以提升性能,增加內存消耗。
  • compressableMimeType 使用HTTP壓縮的MIME類型,使用逗號分割,默認值是 text/html,text/xml,text/plain。
  • compression 為了節省帶寬,可以將這個值設置為on,從而啟用HTTP/1.1 GZIP壓縮。off關閉壓縮,forces強制使用壓縮,默認值是off。
  • connectionTimeout Connector接受一個連接后等待的時間(milliseconds),默認值是60000。
  • executor 在Service節點下,Connector節點前可以配置一個Executor節點用於管理線程,這個屬性的值是配置的Executor的名稱,如果應用了此屬性且executor存在,那么任何其他的關於thread的配置將會被忽略。
  • keepAliveTimeout 在Connector關閉連接前,Connector為另外一個請求Keep Alive所等待的微妙數,默認值和 connectionTimeout 一樣。
  • maxHttpHeaderSize HTTP請求、響應頭信息的最大大小,默認是8192bytes。
  • maxKeepAliveRequests HTTP/1.0 Keep Alive 和HTTP/1.1 Keep Alive / Pipeline的最大請求數目,如果設置為1,將會禁用掉Keep Alive和Pipeline,如果設置為小於0的數,Keep Alive的最大請求數將沒有限制。默認為100。
  • maxThreads 用於處理用戶請求的最大線程數,默認值是20。
  • noCompressionUserAgents: 設置不使用HTTP GZIP壓縮的客戶端,使用逗號分隔,在某些瀏覽器不支持壓縮的時候可以使用此屬性。
  • port Connector監聽的端口。
  • restrictedUserAgents 設置不使用Keep Alive的客戶端代理名稱,使用逗號分割,默認值是空字符串。
  • server 覆蓋HTTP響應的serve頭信息,如果不設置的話,默認值是 Apache-Coyote/1.1。一般情況下不需要關注此屬性。
  • socketBuffer Socket輸出流緩沖區的大小,默認是9000bytes,如果設置為小於0的值,則表示不使用此緩沖區。
  • tcpNoDelay 默認值是true,設置為true可以提高系統性能。
  • threadPriority 請求處理線程的優先級,默認的優先級是NORMAL。
  • https://www.xuebuyuan.com/1881057.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM