【发布时间】:2012-01-26 07:41:18
【问题描述】:
我有两台 Tomcat 服务器,它们需要保持持久连接以减少 SSL 握手。一台服务器(代理)位于 DMZ 中,而另一台则安全地位于另一个防火墙后面。代理基本上只是运行一个简单的 servlet,在将请求转发到安全机器之前进行一些完整性检查。根据最初的请求,机器在执行实际工作之前会交换证书。因此,我想保持一个持续连接,超时几分钟。
为了与安全服务器通信,代理上的 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 确实遵守此超时。
更新(2011 年 12 月 23 日):在运行了一些实验之后,我尝试使用 Apache 的 HttpClient (3.1) 而不是 HttpsUrlConnection 编写一些快速而肮脏的代码。看起来 HttpClient 设置为使用 Keep-Alive 时,只是等待服务器关闭连接。虽然不知道要等多久。我打算让 HTTP 连接保持活动 3 到 5 分钟。
【问题讨论】:
-
“大约 5 或 10 秒后 TCP 连接关闭”。到哪一端?客户端还是服务器?
-
被客户端关闭。
-
你知道,你描述的场景; DMZ 中的 WebServer 将请求转发到某个防火墙后面的 AppServers,通常由 DMZ 中的 Apache HTTPD 处理,执行 https 操作并使用 AJP 连接器 (tomcat.apache.org/tomcat-4.0-doc/config/ajp.html) 将请求转发到 Tomcat AppServers。这是避免 SSL 开销的另一种方法。
-
您可以使用 apache tomcat 连接器在防火墙后面的服务器和 DMZ 服务器之间保持持久连接,可以将安全机器配置为代理中的工作人员。检查此以获取更多信息tomcat.apache.org/connectors-doc/generic_howto/workers.html
-
@James 你应该自己发布一个答案并接受它。这是一件非常好的事情。它还有助于保持网站整洁:)
标签: java tomcat httpurlconnection keep-alive