Apache HTTPD关闭连接或不将请求重定向到servlet容器

时间:2016-09-14 12:19:59

标签: java apache sockets tomcat servlets

我们的系统包括两部分:

第一部分: 一个带有" / aaa"的Servlet网址映射。

第二部分: 一个简单的套接字程序,它连接到我们的servlet并传输二进制数据。

系统工作正常但是,在两个部分(我们的servlet和套接字程序)之间传入Apache HTTPD后,HTTPD会阻止数据流。

换句话说,HTTPD没有将请求重定向到Tomcat,我认为它等待完全接收请求。

开始流式传输的请求标头是:

POST /aaa HTTP/1.1
Host: mysite.com
Content-Type: application/octet-stream
Content-Length: 2147483647
connection: keep-alive

如果我用Content-Length: 2147483647替换Transfer-Encoding: chunked标头,请求将不会重定向到servlet。

此外,如果我将Content-Length设置为较小的值,请求将被重定向到servlet,但连接将被关闭。

EDIT1: 以下几行已经反复出现在apache error_log文件中

[Wed Sep 07 07:30:34.180585 2016] [proxy_http:error] [pid 2253:tid 140090191890176] [client 162.93.19.34:45769] AH01114: HTTP: failed to make connection to backend: 127.0.0.1, referer: example.com/aaa/
[Wed Sep 07 07:30:34.180700 2016] [proxy:error] [pid 2253:tid 140090191890176] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:12007 (127.0.0.1) failed

[Wed Sep 14 06:25:18.406899 2016] [proxy_http:error] [pid 27777:tid 140089871005440] (70008)Partial results are valid but processing is incomplete: [client 162.93.19.34:60284] AH01110: error reading response

您对HTTP标头的建议是什么?

感谢高级。

1 个答案:

答案 0 :(得分:1)

不可能使用HTTP在客户端和服务器之间创建全双工连接。这样做有很多问题。首先要注意的是 HTTP使用请求 - 响应范例,而不是全双工流范例。这意味着客户端发送请求,并且在发送完整请求后,服务器发送响应。即使使用所谓的保持活动,即在同一TCP连接上发送多个请求,情况也是如此。因为这种行为是协议的基础,所以大多数实现都会做出某些(有效的)假设,这使得很难创建全双工连接。

解决方案

最简单的解决方案是将应用程序更改为使用请求 - 响应范例。如果你试图通过HTTP代理隧道,并且由于某种原因真的无法改变你的范例,那么这里有几个想法。

  • 使用2个连接:

每个连接都为您提供单一流。在第一个连接上执行一个简单的GET,让服务器发送回一个没有Content-length标头或一个非常大的Content-length标头的响应(或者如果你正在做HTTP / 1.1,你可以使用chunked transfer编码)。另外,发送" Pragma:no-cache"和"缓存控制:无缓存"标头,以防止任何代理缓存响应。然后,此响应将为您提供server->客户端单工流。然后在第二个连接上执行一个带有非常大的Content-length头的POST,以获取客户端 - >服务器流(从不接收响应)。请注意,这不会与许多代理一起工作,因为他们永远不会转发POST(因为他们正在等待完整的数据)。

  • 使用n + 1个连接:

如果您正在使用URLConnection或通过某些代理,那么您将无法获得真正的客户端 - >服务器流(因为它们在发送请求之前将其全部缓冲)。因此,您必须将客户端 - >服务器流拆分为块,并在单独的请求中发送每个块。服务器 - >客户端流如上所述完成。但请注意,此解决方案可能意味着您将发送大量请求,如果您的服务器或代理不处理保持活动,那么这也意味着创建了大量连接。在任何一种情况下,您仍然可以编写自己的(简单)HTTP服务器,或者使用服务器本机API编写一些服务器端处理程序。

Reference