Wie kann ich eine unterbrochene Verbindung zum Reverse-Proxy eines Apache-Servers beheben?

Wie kann ich eine unterbrochene Verbindung zum Reverse-Proxy eines Apache-Servers beheben?

Beim Senden von Dateien per POST über https über einen Apache-Server-Reverse-Proxy an ein Tomcat-Servlet tritt plötzlich ein zeitweiliger, aber sehr häufiger Fehler auf. Der Fehler scheint nur beim Senden von Dateien mit 20 MB oder mehr (Videos) aufzutreten. Bei kleineren Dateien mit 2 bis 5 MB (JPEGs) ist das Problem nicht aufgetreten.

Der Fehler tritt auf zwei der fünf Server auf, auf denen wir es ausprobiert haben.

Auf der Serverseite der Verbindung, also einem mit Jersey erstellten Tomcat-Servlet, erhalten wir:

java.net.SocketException: Connection reset

Der Apache-Server auf derselben Maschine, der als Reverse-Proxy fungiert, gibt diese Fehlermeldung aus:

[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 ()

Das Festlegen der Protokollierungsebene des Apache-Servers auf „Debuggen“ und Reproduzieren des Problems liefert keine zusätzlichen Informationen. Wir erhalten immer noch dieselbe Fehlermeldung ohne zugehörige Nachrichten.

Etwas seltener kommt es vor, dass wir auf der Tomcat-Seite keine Ausnahme erhalten, aber wenn wir die Anzahl der übertragenen Bytes anhand des Content-Length-Headers überprüfen, stellen wir fest, dass nicht alles durchgekommen ist. Der Fehler im Apache-Server in diesem zweiten Szenario ist derselbe wie im ersten „Proxy: Übergabe des Anforderungstexts fehlgeschlagen …“

Die Apache-Serverversion ist auf einem Server 2.2.15.29 und auf dem anderen 2.2.15.30, wobei sie in allen Fällen unter CentOS 6.2 läuft. Die Reverse-Proxy-Regeln sind wie folgt eingerichtet:

<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>

Beachten Sie, dass die Proxy-Weiterleitung nur über http und nicht über https erfolgt.

Wir verwenden selbstsignierte Zertifikate für die SSL-Konfiguration. Die OpenSSL-Version ist 1.0.1e-fips auf einem der fehlerhaften Server und 1.0.0-fips auf dem anderen.

Auf der Tomcat-Seite führen wir 7.0.26 aus und verwenden Jersey 1.8.

Ich bezweifle, dass es eine Rolle spielt, aber die Browserverbindung, von der der POST stammt, ist entweder Firefox 27 oder Chrome 34.

In einem Fall wurde unser Servlet kürzlich aktualisiert, obwohl der Code für die Handhabung von Datei-Uploads nicht geändert wurde. Auf dem anderen Server, auf dem das Problem auftritt, führen wir ein Servlet aus, das Monate alt ist. Tatsächlich sind uns auf dieser zweiten Maschine in den letzten Monaten keine Code- oder Konfigurationsänderungen bekannt – sie war von Mitte Februar bis heute ungenutzt.

Was muss ich als Nächstes tun, um dieses Problem zu beheben? Wo muss ich suchen?

-- Aktualisieren --

Weitere Tests zeigen, dass die Verbindung manchmal unterbrochen wird, selbst wenn ich den Apache-Server umgehe und direkt an Tomcat sende. Es scheint also überhaupt kein Proxy-Problem zu sein.

-- Weitere Updates --

Wir haben zeitweise Probleme beim Kopieren derselben großen Dateien über SCP. Es sieht so aus, als ob das zugrunde liegende Problem die Firewall zwischen unserem Büro-/Entwicklungssubnetz und dem Produktions-/Staging-Netzwerk ist. Die Fehlermeldung, wenn ein SCP-Kopiervorgang fehlschlägt, lautet „Unterbrochene Leitung“.

Hier ist der Stacktrace des Servlets, wenn die Verbindung abbricht:

16.05.2014 13:20:44,566 [http-bio-8080-exec-7] FEHLER com.objectvideo.wx.casemanager.service.resources.QueryFileService [null] – Hochladen der Datei(en) fehlgeschlagen. javax.ws.rs.WebApplicationException: java.net.SocketException: Verbindung zurückgesetzt bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:342) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadFile(QueryFileService.java:607) bei sun.reflect.GeneratedMethodAccessor37.invoke(Unbekannte Quelle) bei sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) bei java.lang.reflect.Method.invoke(Method.java:606) bei com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) bei com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205) bei com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) bei com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) bei com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) bei com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) bei com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) bei com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) bei com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) bei com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) bei com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) bei com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) bei com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) bei com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) bei javax.servlet.http.HttpServlet.service(HttpServlet.java:722) bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) bei org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) bei org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) bei org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) bei org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) bei org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) bei org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) bei org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) bei org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) bei org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) bei org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) bei org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) bei org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) bei java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) bei java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) bei java.lang.Thread.run(Thread.java:724) Verursacht durch: java.net.SocketException: Verbindung zurückgesetzt bei java.net.SocketInputStream.read(SocketInputStream.java:189) bei java.net.SocketInputStream.read(SocketInputStream.java:121) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) bei org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) bei org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) bei org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) bei org.apache.coyote.Request.doRead(Request.java:422) bei org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) bei org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) bei org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) bei org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) bei org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) bei org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 weitereprocess(AbstractHttp11Processor.java:987) bei org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) bei org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) bei java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) bei java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) bei java.lang.Thread.run(Thread.java:724) Verursacht durch: java.net.SocketException: Verbindung zurückgesetzt bei java.net.SocketInputStream.read(SocketInputStream.java:189) bei java.net.SocketInputStream.read(SocketInputStream.java:121) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) bei org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) bei org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) bei org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) bei org.apache.coyote.Request.doRead(Request.java:422) bei org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) bei org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) bei org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) bei org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) bei org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) bei org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 weitereprocess(AbstractHttp11Processor.java:987) bei org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) bei org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) bei java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) bei java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) bei java.lang.Thread.run(Thread.java:724) Verursacht durch: java.net.SocketException: Verbindung zurückgesetzt bei java.net.SocketInputStream.read(SocketInputStream.java:189) bei java.net.SocketInputStream.read(SocketInputStream.java:121) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) bei org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) bei org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) bei org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) bei org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) bei org.apache.coyote.Request.doRead(Request.java:422) bei org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) bei org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) bei org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) bei org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) bei org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) bei org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 weiterefüllen(InternalInputBuffer.java:501) bei org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) bei org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) bei org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) bei org.apache.coyote.Request.doRead(Request.java:422) bei org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) bei org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) bei org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) bei org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) bei org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) bei org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 weiterefüllen(InternalInputBuffer.java:501) bei org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) bei org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:118) bei org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:326) bei org.apache.coyote.Request.doRead(Request.java:422) bei org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) bei org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) bei org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) bei org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:167) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1719) bei org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1696) bei org.apache.commons.io.IOUtils.copy(IOUtils.java:1671) bei org.apache.commons.io.FileUtils.copyInputStreamToFile(FileUtils.java:1444) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.writeTempFile(QueryFileService.java:535) bei com.objectvideo.wx.casemanager.service.resources.QueryFileService.uploadRawFile(QueryFileService.java:320) ... 35 weitere

Antwort1

Versuchen Sie, keepalive=onIhre ProxyPassAnweisungen anzuhängen.

Dies muss möglicherweise auch auf der globalen Apache-Serverseite KeepAliveeingestellt werden .on

verwandte Informationen