我有两个Tomcat服务器,它们需要维护一个持久连接以减少SSL握手。一台服务器(代理服务器)位于DMZ中,而另一台服务器安全地位于另一台防火墙后面。代理基本上只运行一个简单的servlet,该servlet在将请求转发到安全机器之前会进行一些完整性检查。最初请求时,机器会在执行实际工作之前交换证书。因此,我想保持一个持续几分钟的超时连接。
为了与安全服务器通信,代理上的servlet使用HttpsUrlConnection。我已经设置了WireShark,并且注意到无论keepAliveTimeout在安全机器上为连接器设置什么值,TCP连接都会在大约5或10秒后关闭。这个数字似乎与我读到的是默认超时以及Java如何处理HTTP Keep- Alive相匹配。此链接说明,Keep- Alive如果服务器发送了Java,则Java将接受超时,否则Java将在关闭连接之前使用5秒(直接连接)或10秒(代理连接)。
HttpsUrlConnection
keepAliveTimeout
Keep- Alive
我要弄清楚的是如何强制Tomcat发送Keep-Alive标头。不是Connection: Keep-Alive,但是Keep-Alive: timeout=x。
Connection: Keep-Alive
Keep-Alive: timeout=x
我已经试验过Apache HTTP服务器,并且修改keepAliveTimeouthttpd.conf中的确会导致Keep- Alive标头更改其超时值。此外,Java确实遵守此超时。
更新(12/23/11): 在运行了一些实验之后,我尝试使用Apache的HttpClient(3.1)而不是鞭打一些快速而肮脏的代码HttpsUrlConnection。设置为使用Keep- Alive时,HttpClient似乎只是在等待服务器关闭连接。我不知道要等多久。我正在努力将HTTP连接保持3到5分钟。
通过将Tomcat连接器中的keepAliveTimeout设置为300000,我能够使用HttpClient 3.1保持HTTP连接打开5分钟。我使用WireShark进行了验证,即服务器将终止连接,而HttpClient将仅等待。通过HttpClient进行的后续请求将重用现有的TCP连接(避免进行任何进一步的SSL握手)。但是,关键是只有一个HttpClient实例(即每次都不创建一个)。这对于大多数人来说可能是显而易见的,但是我不确定HTTPClient的API机制是什么。简而言之,创建一个HttpClient实例,并为每个请求(POST,GET等)创建一个新的PostMethod,GetMethod等。这将导致TCP连接被重用。