如何解决Apache服务器反向代理断开的连接?

在通过https服务器通过Apache服务器反向代理将文件发布到Tomcat servlet时,我们突然看到一个间歇性的,但非常频繁的错误。 该错误似乎只在发布20 MB或更多(video)的文件时发生。 我们还没有看到2到5 MB(JPEG)的较小文件的问题。

在我们尝试过的五台服务器中,有两台发生错误。

在连接的服务器端,即使用Jersey创build的Tomcat servlet,我们得到:

java.net.SocketException: Connection reset 

作为反向代理的同一台计算机上的Apache服务器提供了以下错误消息:

 [Thu May 15 17:08:58 2014] [error] proxy: pass request body failed to 127.0.0.1:8080 (localhost) from 192.168.16.xx () 

设置Apache服务器的日志级别来debugging和重现问题不会产生额外的信息 – 我们仍然得到相同的错误消息,没有任何关联的消息。

less一些,我们没有在Tomcat方面得到例外,但是检查传输的字节数量与Content-Length头部相比,并不是所有的东西都能完成。 第二种情况下,Apache Server中的错误与第一个“proxy:pass request body failed …”中的错误相同。

在一个服务器上的Apache服务器版本是2.2.15.29,另一个是在CentOS 6.2下运行的2.2.15.30。 反向代理规则是这样设置的:

 <IfModule mod_proxy.c> ProxyRequests Off # Case Manager Tomcat web service ProxyPass /casemanager http://localhost:8080/casemanager ProxyPassReverse /casemanager http://localhost:8080/casemanager # Matcher images directories ProxyPass /matcher-images http://xxx108:80/matcher-images </IfModule> 

请注意,代理传递只是通过http,而不是https。

我们为SSLconfiguration使用自签名证书。 OpenSSL版本是1.0.1e-fips在一个失败的服务器和1.0.0-fips在另一个。

在Tomcat方面,我们正在运行7.0.26并使用Jersey 1.8。

我怀疑它是否重要,但POST来源的浏览器连接是Firefox 27或Chrome 34。

在一种情况下,我们的servlet最近更新了,尽pipe处理file upload的代码最近没有改变。 在遇到问题的其他服务器上,我们正在运行几个月前的servlet构build。 事实上,在第二台机器上,我们并没有意识到过去几个月有任何代码或configuration变化 – 从二月中旬到今天一直闲置。

接下来我应该怎么做才能解决这个问题? 我应该在哪里看?

– 更新 –

进一步的testing表明,即使绕过Apache服务器和POST直接到Tomcat,连接有时会被丢弃。 所以它似乎并不是一个代理问题。

– 进一步更新 –

我们间歇地看到问题通过scp复制相同的大文件。 看起来底层的问题是我们的办公/开发子网和生产/分期networking之间的防火墙。 scp副本失败时的错误消息是“损坏的pipe道”。

这是连接断开时servlet的堆栈跟踪:

2014-05-16 13:20:44,566 [http-bio-8080-exec-7]错误com.objectvideo.wx.casemanager.service.resources.QueryFileService [null] – 上传文件失败。 javax.ws.rs.WebApplicationException:java.net.SocketException:在com.objectvideo.wx.casemanager.service的com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:342)处重置连接。在sun.reflect.GeneratedMethodAccessor37.invoke(未知的源代码)上的resources.QueryFileService.uploadFile(QueryFileService.java:607)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke Method.java:606)at com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke(JavaMethodInvokerFactory.java:60)at com.sun.jersey.server.impl.model.method.dispatch.Abs​​tractResourceMethodDispatchProvider $ ResponseOutInvoker._dispatch (AbstractResourceMethodDispatchProvider.java:205)at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)at com.sun.jersey.server.impl.uri.rules.HttpMethodRule .accept(HttpMethodRule.java:288)at com.sun.jer sey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)at com.sun。 jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)at com.sun.jersey。 server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)at com.sun.jersey.server.impl。 application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)at com.sun.jersey.spi.container.servlet.ServletContainer。服务(ServletContainer.java:537)位于javax.servlet.http.HttpServlet的com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)处。 服务(HttpServlet.java:722)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在org.apache (org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java).catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) :472)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)at org.apache.catalina.valves。在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)上的AccessLogValve.invoke(AccessLogValve.java:927) .apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)at org.apache.co yote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:579)at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:307)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor。 java:1145)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:724)导致:java.net.SocketException:连接重置java.net.SocketInputStream.read(SocketInputStream.java:189)at java.net.SocketInputStream.read(SocketInputStream.java:121)at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532)at org .apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501)org.apache.coyote.http11.InternalInputBuffer $ InputStreamInputBuffer.doRead(InternalInputBuffer.java:563)at org.apache.coyote.http11.filters.IdentityInputFilter .doRead(IdentityInputFilter.java:118)at org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java :326)at org.apache.coyote.Request.doRead(Request.java:422)at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290)at org.apache.tomcat.util.buf。 org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167)org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315)org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167)org.ByteChunk.substract(ByteChunk.java:431) .apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719)at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696)at org.apache.commons.io.IOUtils.copy(IOUtils .java:1671)at com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535)at org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444)。 objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320)… 35更多

尝试将keepalive=on附加到您的ProxyPass指令。

这可能需要在如此全局的Apache服务器端上设置KeepAlive