
De repente estamos viendo un error intermitente, pero muy frecuente, al publicar archivos en un servlet Tomcat a través de https a través de un proxy inverso del servidor Apache. El error solo parece ocurrir al PUBLICAR archivos de 20 MB o más (videos). No hemos visto el problema con archivos más pequeños de 2 a 5 MB (JPEG).
El error ocurre en dos de los cinco servidores en los que lo probamos.
En el lado del servidor de la conexión, es decir, un servlet Tomcat creado con Jersey, obtenemos:
java.net.SocketException: Connection reset
El servidor Apache en la misma máquina, actuando como proxy inverso, muestra este mensaje de error:
[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 ()
Configurar el nivel de registro del servidor Apache para depurar y reproducir el problema no produce información adicional; seguimos recibiendo el mismo mensaje de error sin ningún mensaje asociado.
Con un poco menos de frecuencia, no obtenemos una excepción en el lado de Tomcat, pero verificar la cantidad de bytes transferidos con el encabezado Content-Length revela que no todo logró pasar. El error en el servidor Apache en este segundo escenario es el mismo que en el primer "proxy: falló el cuerpo de la solicitud de paso..."
La versión del servidor Apache es 2.2.15.29 en un servidor y 2.2.15.30 en el otro, ejecutándose bajo CentOS 6.2 en todos los casos. Las reglas de proxy inverso se configuran así:
<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://x.x.x.108:80/matcher-images
</IfModule>
Tenga en cuenta que el paso del proxy solo se realiza a través de http, no de https.
Estamos utilizando certificados autofirmados para la configuración SSL. La versión de OpenSSL es 1.0.1e-fips en uno de los servidores defectuosos y 1.0.0-fips en el otro.
En el lado de Tomcat, estamos ejecutando 7.0.26 y usando Jersey 1.8.
Dudo que importe, pero la conexión del navegador desde la que se origina el POST es Firefox 27 o Chrome 34.
En un caso, nuestro servlet se actualizó recientemente, aunque el código para manejar la carga de archivos no cambió recientemente. En el otro servidor que experimenta el problema, estamos ejecutando una compilación de servlet de hace meses. De hecho, en esa segunda máquina, no tenemos conocimiento de ningún cambio de código o configuración en los últimos meses; había estado inactiva desde mediados de febrero hasta hoy.
¿Qué debo hacer a continuación para solucionar este problema? ¿Dónde debería buscar?
-- Actualizar --
Pruebas adicionales muestran que la conexión a veces se interrumpe incluso si omito el servidor Apache y realizo la publicación directamente en Tomcat. Por lo tanto, no parece ser un problema de proxy en absoluto.
-- Más actualizaciones --
De forma intermitente vemos problemas al copiar los mismos archivos grandes a través de scp. Parece que el problema subyacente es el firewall entre nuestra subred de oficina/desarrollo y la red de producción/ensayo. El mensaje de error cuando falla una copia de scp es "Tubería rota".
Aquí está el seguimiento de la pila del servlet cuando se interrumpe la conexión:
2014-05-16 13:20:44,566 [http-bio-8080-exec-7] ERROR com.objectvideo.wx.casemanager.service.resources.QueryFileService [nulo] - No se pudieron cargar los archivos. javax.ws.rs.WebApplicationException: java.net.SocketException: restablecimiento de la conexión en com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:342) en com.objectvideo.wx.casemanager.service. resources.QueryFileService.uploadFile(QueryFileService.java:607) en sun.reflect.GeneratedMethodAccessor37.invoke(Fuente desconocida) en sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) en java.lang.reflect.Method.invoke( Method.java:606) en com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) en com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch (AbstractResourceMethodDispatchProvider.java:205) en com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) en com.sun.jersey.server.impl.uri.rules.HttpMethodRule .accept(HttpMethodRule.java:288) en com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) en com.sun.jersey.server.impl.uri.rules.RightHandPathRule .accept(RightHandPathRule.java:147) en com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) en com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1469) en com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) en com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java :1349) en com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) en com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) en com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) en com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) en javax.servlet. http.HttpServlet.service(HttpServlet.java:722) en org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) en org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) en org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) en org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) en org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:472) en org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) en org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) en org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) en org.apache.catalina.core.StandardEngineValve .invoke(StandardEngineValve.java:118) en org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) en org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) en org. apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) en org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) en java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1145) en java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) en java.lang.Thread.run(Thread.java:724) Causado por: java.net.SocketException: Conexión restablecer en java.net.SocketInputStream.read(SocketInputStream.java:189) en java.net.SocketInputStream.read(SocketInputStream.java:121) en org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) en org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) en org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) en org.apache.coyote.http11.filters .IdentityInputFilter.doRead(IdentityInputFilter.java:118) en org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) en org.apache.coyote.Request.doRead(Request.java:422) en org. apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) en org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) en org.apache.catalina.connector.InputBuffer.read( InputBuffer.java:315) en org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) en org.apache.commons .io.IOUtils.copyLarge(IOUtils.java:1696) en org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) en org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444 ) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 másproceso(AbstractHttp11Processor.java:987) en org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) en org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) en java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) en java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) en java.lang.Thread.run(Thread.java:724 ) Causado por: java.net.SocketException: conexión restablecida en java.net.SocketInputStream.read(SocketInputStream.java:189) en java.net.SocketInputStream.read(SocketInputStream.java:121) en org.apache.coyote.http11 .InternalInputBuffer.fill(InternalInputBuffer.java:532) en org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) en org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563 ) en org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) en org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) en org.apache.coyote.Request. doRead(Request.java:422) en org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) en org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) en org .apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) en org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) en org.apache.commons.io.IOUtils.copyLarge(IOUtils .java:1719) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) en org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) en org.apache.commons. io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) en com.objectvideo.wx.casemanager.service.resources.QueryFileService. uploadRawFile(QueryFileService.java:320) ... 35 másproceso(AbstractHttp11Processor.java:987) en org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) en org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) en java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) en java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) en java.lang.Thread.run(Thread.java:724 ) Causado por: java.net.SocketException: conexión restablecida en java.net.SocketInputStream.read(SocketInputStream.java:189) en java.net.SocketInputStream.read(SocketInputStream.java:121) en org.apache.coyote.http11 .InternalInputBuffer.fill(InternalInputBuffer.java:532) en org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) en org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563 ) en org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) en org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) en org.apache.coyote.Request. doRead(Request.java:422) en org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) en org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) en org .apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) en org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) en org.apache.commons.io.IOUtils.copyLarge(IOUtils .java:1719) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) en org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) en org.apache.commons. io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) en com.objectvideo.wx.casemanager.service.resources.QueryFileService. uploadRawFile(QueryFileService.java:320) ... 35 másfill(InternalInputBuffer.java:501) en org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) en org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) en org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) en org.apache.coyote.Request.doRead(Request.java:422) en org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer .java:290) en org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) en org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) en org.apache. catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java: 1696) en org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) en org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) en com.objectvideo.wx.casemanager.service .resources.QueryFileService.writeTempFile(QueryFileService.java:535) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 másfill(InternalInputBuffer.java:501) en org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) en org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) en org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) en org.apache.coyote.Request.doRead(Request.java:422) en org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer .java:290) en org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) en org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) en org.apache. catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) en org.apache.commons.io.IOUtils.copyLarge(IOUtils.java: 1696) en org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) en org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) en com.objectvideo.wx.casemanager.service .resources.QueryFileService.writeTempFile(QueryFileService.java:535) en com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 más
Respuesta1
Intente agregarlo keepalive=on
a sus ProxyPass
directivas.
Es posible que esto también deba KeepAlive
configurarse en el lado global del servidor Apache.on