Zeitweiliger Fehler beim Verwenden von mod_proxy, um einen Reverse-Proxy für den SOAP-Dienst auszuführen

17

Ich erhalte diesen Fehler alle paar Minuten, wenn ich mod_proxy als Reverse-Proxy für einen SOAP-Webdienst verwende. Wahrscheinlich gehen 3 oder 4 Anfragen pro Sekunde ein, also reden wir über 1 oder 2 von tausend, die diesen Fehler haben.

[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] (20014)Internal error: proxy: error reading status line from remote server soap1.server:8888
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] proxy: Error reading from remote server returned by /someapp/path/to/web/service

Dies führt dazu, dass die Anforderung fehlschlägt. Wenn ich den Client direkt mit dem Soap-Server verbinden lasse, ohne den Proxy zu verwenden, ist der Erfolg 100%, sodass das Problem im Proxy zu liegen scheint

Die Konfiguration sieht so aus. Der Zweck besteht darin, auf einen Sicherungsserver zu wechseln, wenn der primäre nicht verfügbar ist:

<Proxy balancer://apicluster>  
BalancerMember http://soap1.server:8888 lbset=0 
BalancerMember http://soap2.server:8888 lbset=1 
</Proxy>  

ProxyPass /someapp balancer://apicluster/someapp 
ProxyPassReverse / balancer://apicluster/someapp 

Ist jemand darauf gestoßen und hat einen Fix gefunden? Es gibt einige Erwähnungen in Fehlerberichten, aber keine Lösungen. Das Einzige, was ungewöhnlich sein kann, ist, dass die Client-Anfrage 100 MB oder mehr umfassen kann. Daher kann die Anfrage etwas länger dauern, als Sie es für einen SOAP-Anruf erwarten würden.

JOTN
quelle
Die Antwort von David Purdue (SetEnv Proxy-Initial-Not-Pooled 1) ist eine gültige Antwort heutzutage (2016).
MattBianco

Antworten:

27

Für den Fall, dass jemand anderes darauf stößt. Dies ist ein Fehler in mod_proxy, der vermieden werden kann, indem die folgenden Zeilen in die httpd.conf eingefügt werden:

SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1

https://issues.apache.org/bugzilla/show_bug.cgi?id=37770

Informationen dazu, was diese Variablen bewirken, finden Sie in der mod_proxyDokumentation . Sie haben einen speziellen Abschnitt, Protocol Adjustment (Protokollanpassung), in dem diese Variablen behandelt werden.

JOTN
quelle
5

Beachten Sie die Apache-Dokumentation hier: http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html

Es scheint, dass es eine Racebedingung in mod_proxy_http gibt, aber dies kann vermieden werden, indem Folgendes eingeschlossen wird:

SetEnv proxy-initial-not-pooled 1

Dies verhindert, dass Apache eine Poolverbindung verwendet, wenn es sich um eine erste Anforderung handelt.

Das Dokument stellt jedoch fest, dass diese Einstellung zu einer Leistungsverschlechterung führt.

David Purdue
quelle
1
proxy-initial-not-pooledist nur dann effektiv, wenn Sie über einen bestimmten Patch verfügen, von dem ich glaube, dass er nicht Teil von httpd 2.2 ist. Ich kenne httpd 2.4 nicht. Siehe bz.apache.org/bugzilla/show_bug.cgi?id=37770#c88
kubanczyk
0

Sie können diese verwandte Fehlermeldung ( AH01102: error reading status line from remote server) auch unterdrücken, indem Sie das Apache-Modul mod_reqtimeout und diese conf-Direktive verwenden:

RequestReadTimeout header=30

Sie müssen das reqtimeout-Modul wahrscheinlich wie folgt aktivieren:

$ sudo a2enmod reqtimeout
$ sudo apache2ctl restart
Martlark
quelle