我有两台Tomcat服务器需要维护持久连接以减少SSL握手。一台服务器(代理服务器)位于DMZ中,另一台服务器安全地位于另一台防火墙之后。代理基本上只运行一个简单的servlet,在将请求转发到安全机器之前进行一些理智的检查。在进行真正的工作之前,首先要求机器交换证书。因此,我想用几分钟的超时时间保持持续连接。Tomcat,HTTP Keep-Alive和Java的HttpsUrlConnection
要与安全服务器交谈,代理上的servlet使用HttpsUrlConnection
。我已经设置了WireShark,并且我注意到无论在安全机器上为连接器设置了什么值keepAliveTimeout
,TCP连接在大约5或10秒后都会关闭。这个数字似乎与我读的是缺省超时以及Java如何处理HTTP Keep-Alive相匹配。这个link解释说,如果服务器发送它,则Java将承认Keep-Alive
超时,否则它在关闭连接之前使用5秒(直接连接)或10秒(代理连接)。
我想弄清楚的是我该如何强制Tomcat发送Keep-Alive头文件。不是,Connection: Keep-Alive
,但Keep-Alive: timeout=x
。
我已经尝试过使用Apache HTTP服务器,并修改httpd.conf中的keepAliveTimeout
的确会导致Keep-Alive标头更改其超时值。此外Java确实遵守这个超时。
UPDATE(11年12月23日):运行了几个实验我尝试使用Apache的HttpClient的(3.1)煽动一些快速和肮脏的代码,而不是HttpsUrlConnection
后。看起来,HttpClient在设置为使用Keep-Alive时,只是等待服务器关闭连接。我不知道会等多久。我正在拍摄,以保持HTTP连接3到5分钟。
“约5秒或10秒后TCP连接关闭”。为此目的?客户端还是服务器? – EJP 2011-12-23 03:21:27
它被客户关闭。 – 2011-12-23 16:56:41
你知道,你描述的场景; DMZ中的WebServer向某些防火墙后面的AppServers转发请求,通常使用DMZ中的Apache HTTPD处理https内容并使用AJP连接器将请求转发到Tomcat AppServers(http://tomcat.apache.org/tomcat-4.0 -doc /配置/ ajp.html)。这是避免SSL开销的另一种方法。 – 2011-12-29 23:16:49