Tomcat Connector connectionTimeout含义和验证

1. Tomcat配置

今天小戚发出一封邮件,说由于线上系统中tomcat的链接超时(connectionTimeout)设置成60ms,形成第三方访问公司的服务,老是502异常。html

这个设置在$tomcat/conf/server.xml中web

<!-- 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.htmlapache

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).tomcat

以上中文是通过以下分析过程得出的。服务器

 

2.1. 是不是整个链接处理的时间?

写了一个servlet,doGet先sleep一段时间,再写一个输出,直接用浏览器访问。cookie

通过测试,发现和这个时间无关。session

 

2.2. 用HttpURLConnection作测试

写客户端模拟超时,多是由于API直接实现到提交URI了,另外还怀疑底层有自动保持链接的动做,反正怎么Sleep都不超时,得换个写法了。app

明天连上TCPMon看看后台有没有自动保持链接的动做。socket

        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
相关文章
相关标签/搜索