2011-12-22 51 views
14

我有两台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分钟。

+0

“约5秒或10秒后TCP连接关闭”。为此目的?客户端还是服务器? – EJP 2011-12-23 03:21:27

+0

它被客户关闭。 – 2011-12-23 16:56:41

+0

你知道,你描述的场景; 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

回答

6

我能够使用HttpClient 3.1通过将Tomcat连接器中的keepAliveTimeout设置为300000来使HTTP连接保持打开状态5分钟。我使用WireShark验证了服务器将终止连接,而HttpClient只会等待。通过HttpClient的后续请求重用现有的TCP连接(避免进一步的SSL握手)。那里的关键是有一个HttpClient实例(即不是每次都创建一个)。这可能对大多数人来说显而易见,但我不确定HTTPClient的API机制是什么。简而言之,创建一个HttpClient实例并为每个请求(POST,GET等)创建一个新的PostMethod,GetMethod等。这将导致TCP连接被重用。

1

Java API Http(s)UrlConnection根据following detailed explanation(仔细阅读 - 每个细节都很重要)无缝地遵守Keep-Alive信息并管理每个服务器主机的连接池。

在这种情况下,您的代码必须完全读取缓冲区,关闭流并在IOException的情况下读取错误。

当然HttpClient约束较少,但处理您的情况的最佳方式是使用其MultiThreadedHttpConnectionManager感谢following guidelines

4

在Tomcat中,我设法设置的标头在我的HttpServelet使用HttpServletResponse.addHeader()这样的:

response.addHeader("Connection", "Keep-Alive"); 
    response.addHeader("Keep-Alive", "timeout=60000"); 

我使用Wireshark确认这确实与HttpURLConnection类在客户端工作。如果您没有设置“连接”标题,则不起作用,因此您需要设置两者。

+0

如果添加了Keep-Alive配置,则连接标头应由tomcat自动设置。您正在复制tomcat的server.xml中的Keep-Alive以及您正在返回自定义Keep-Alive标头的代码。如果应用程序超时比tomcat长,或者tomcat本身决定关闭,则最坏的情况是非常有可能出现同步,最坏的情况是客户端将会失败。 – kisna 2015-07-24 19:31:14