Proxy-Fehler 502 "Grund: Fehler beim Lesen vom Remote-Server" mit Apache 2.2.3 (Debian) mod_proxy und Jetty 6.1.18


80

Apache empfängt Anfragen an Port: 80 und leitet sie an Jetty an Port: 8080 weiter

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

Mein Dilemma: Alles funktioniert normal (schnelle Anfragen, einige Sekunden oder einige zehn Sekunden lang Anfragen werden verarbeitet ok ). Probleme treten auf, wenn die Anforderungsverarbeitung lange dauert (wenige Minuten?).

Wenn ich stattdessen eine Anfrage direkt an Jetty im Port: 8080 stelle, wird die Anfrage in Ordnung verarbeitet. Das Problem liegt also wahrscheinlich irgendwo zwischen Apache und Jetty, wo ich mod_proxy verwende . Wie kann man das lösen?

Ich habe bereits einige "Tricks" in Bezug auf KeepAlive-Einstellungen ausprobiert, ohne Erfolg. Hier ist meine aktuelle Konfiguration, irgendwelche Vorschläge?

#keepalive Off                     ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1  ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1        ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20                       ## I have tried this, does not help
KeepAliveTimeout 600               ## I have tried this, does not help
ProxyTimeout 600                   ## I have tried this, does not help

NameVirtualHost *:80
<VirtualHost _default_:80>
    ServerAdmin webmaster@mydomain.fi

    ServerName www.mydomain.fi

    ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com

    ProxyRequests On
    ProxyVia On
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
    ProxyPassReverse / http://www.mydomain.fi:8080/

    RewriteEngine On
    RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
    RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

</VirtualHost>

Hier ist auch das Debug-Protokoll einer fehlgeschlagenen Anfrage:

74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::

Hi .. ich stecke immer noch fest mit diesem. Alle oben genannten Einstellungen ausprobiert und auch das Erhöhen von Jetty maxIdleTime hat nicht geholfen. Gibt es Hinweise, was als nächstes zu versuchen ist?
Martin

Antworten:


91

Ich habe das Problem gelöst. Das Keepalive=Onsollte in die ProxyPassKonfigurationszeile eingefügt werden :

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

Siehst du das

Keepalive=On

Dort? Es ist kritisch ;)


9
Ich glaube, Sie können Ihre eigenen Antworten als Akzeptiert markieren. Es markiert die Frage als im System gelöst, damit andere Personen sie finden können.
sysadmin1138

Wo genau setzen Sie das?
AlxVallejo

1
@AlxVallejo Sie sollten Ihre Konfigurationsdateien hier /etc/apache2/sites-enabled/[sitename].conf finden
Steven

1
Wir haben genau die gleichen Proxy-Fehler. Sie kommen sehr selten vor (eine von tausend Anfragen). Warum genau ist das Keepalive=Onkritisch?
Dokaspar

Könnte es nicht das timeout=600oder sein, das retry=1das behebt? (oder die Combo)
MattBianco

4

Haben Sie versucht, Einstellungen vorzunehmen setenv proxy-initial-not-pooled 1?

Referenz hier


Nein, das hat nicht geholfen. Dann geht es nicht um die Rennbedingungen, sondern um die lange Verzögerung und etwas dazwischen (eine Art Missverständnis zwischen Jetty und mod_proxy).

4

Dieser Fehler kann auch auftreten, wenn Sie Ihre Proxy-URL nicht mit einem beenden /. Entweder sollten beide Pfade mit einem /oder keinem enden .


1

Wenn Sie sich das Protokoll ansehen, tritt eine Zeitüberschreitung von 5 Minuten (= 300 Sekunden) auf. Das ist eine ziemlich lange Zeit, um auf eine Antwort zu warten. Wenn Sie direkt auf den Jetty-Server zugreifen, dauert es dann wirklich so lange, bis diese Ressource eine Antwort liefert?

Wenn die fünf Minuten tatsächlich innerhalb der möglichen Antwortzeiten liegen, können Sie versuchen, die ProxyTimeout-Konfigurationsanweisung zu optimieren.

Abhängig von Ihrer Netzwerkkonfiguration kann es durchaus sein, dass es keinen Grund gibt, ein Keepalive-System zu verwenden. (Befindet sich zwischen dem App-Server und dem Proxy eine Firewall, die möglicherweise so konfiguriert ist, dass Sitzungen unterbrochen werden, die zu lange inaktiv sind?) , aber das ProxyTimeout würde das Verhalten des Proxys selbst beeinflussen.

Wenn derselbe Proxy auch andere Backends bedient, ist es besser, das aktuelle ProxyTimeout beizubehalten und das Timeout in der ProxyPass-Direktive zu konfigurieren (siehe Dokumentation zu mod_proxy).

Wenn die Antworten ohne Proxy jedoch durchweg deutlich unter dem Grenzwert von fünf Minuten liegen, kann es zu merkwürdigen Interferenzen zwischen Proxy und App-Server kommen, von denen Sie jedoch nichts angeben Wert für die Identifizierung, was es sein könnte.


"Wenn Sie direkt auf den Jetty-Server zugreifen, dauert es dann wirklich so lange, bis diese Ressource eine Antwort liefert?" -- JA. Ich habe auch versucht, dieses ProxyTimeout auf 600 zu setzen. Hilft nicht. Es gibt keine Firewall zwischen Proxy und Steg. Das Timeout wird auch in ProxyPass konfiguriert.

"Sie liefern nichts Wertvolles, um zu identifizieren, was es sein könnte": Ich weiß nicht, was das sein könnte. Ich erhalte nur eine Fehlermeldung vom Server: Proxy-Fehler Der Proxy-Server hat eine ungültige Antwort von einem Upstream-Server erhalten. Der Proxy-Server konnte die Anforderung GET / nicht verarbeiten. Grund: Fehler beim Lesen vom Remote-Server

Hat sich durch die Erhöhung des Proxy-Timeouts auch die Zeit geändert, die Ihr Browser gedreht hat, bevor der 502-Fehler aufgetreten ist?

Dann zu den Möglichkeiten, wie Sie herausfinden können, was auf dem Anwendungsserver geschieht: Sie können ein paar Thread-Dumps erstellen und anhand dieser Informationen überprüfen, was ausgeführt wird, wenn der Browser wartet. Alternativ können Sie genügend Debug-Protokollierungsanweisungen hinzufügen, um Ihren Code zu verfolgen und die Ursache der Langsamkeit zu lokalisieren.

Ich weiß warum es langsam ist. Ich weiß nicht, warum Apache Proxy die Antwort ablehnt, wenn es endlich fertig ist.

0

Für mich löste das Entfernen eines Header-Wertes, der Transfer-Encoding" (binary)in meiner Server-App (PHP) aufgerufen wurde, das Problem für:

[proxy_http: error] [pid 17623] (22) Ungültiges Argument: [client 127.0.0.1:44929] AH01102: Fehler beim Lesen der Statuszeile vom Remote-Server 0.0.0.0:80

Alle anderen Vorschläge gefallen SetEnv proxy-initial-not-pooledoder Keep-Alivenicht.


0

Wenn die oben genannten Lösungen nicht funktionieren, können Sie versuchen, alle Ihre Apache-Module zu aktivieren, um sicherzustellen, dass Sie kein Modul benötigen, das versehentlich deaktiviert wurde.

Ich habe beispielsweise festgestellt, dass die Ursache meines Problems darin bestand, alle Instanzen von #LoadModule in allen Apache-Konfigurationsdateien durch LoadModule zu ersetzen. Da dies das Problem für mich löste, wusste ich, dass mein Problem kein fehlendes Argument für die KeepAlive-Anweisung war, sondern vielmehr eine fehlende Abhängigkeit.

Denken Sie daran, dass .so-Dateien im Grunde genommen statische Bibliotheken sind. Wenn ein Modul aktiviert ist, bedeutet dies nicht, dass es verwendet wird. Wenn jedoch ein Modul deaktiviert ist, bedeutet dies, dass es nicht verwendet werden kann. Daher schlägt alles, was davon abhängt, zwangsläufig fehl.

Hinweis: Diese Antwort hat einige Abwärtsstimmen erhalten, da meine ursprüngliche Antwort darauf hindeutete, alle Module für immer aktiviert zu lassen. Während Sie dies theoretisch tun können, ohne irgendetwas zu beschädigen, ist dies offensichtlich keine Best-Practice-Lösung.

Bitte haben Sie Verständnis dafür, dass ich dies lediglich als Fehlerbehebungsschritt und nicht als endgültige Lösung vorschlage.

Beachten Sie auch, dass ich ein spezielles Git-Projekt verwende, um alle Apache-Konfigurationsdateien meines lokalen Computers zu verfolgen. Auf diese Weise kann ich diese Art von globalen Such- und Ersetzungsvorgängen in meinem Apache Config-Arbeitsverzeichnis als Fehlerbehebungsschritt ausführen. Wenn die Aktivierung aller Module erfolgreich ist, deaktivieren Sie sie nacheinander erneut und starten Sie dazwischen apache neu, bis Sie herausgefunden haben, welches Modul aktiviert bleiben muss. Wenn Sie das herausgefunden haben, setzen Sie das Repo auf den ursprünglichen Zustand zurück und aktivieren Sie nur das eine Modul, das aktiviert bleiben muss.

Sie werden auch feststellen, dass mit git zum Verfolgen Ihrer Apache-Konfigurationsdateien diese Verzeichnisse bereinigt werden, da Sie diese altmodischen .bak- und .default-Dateien nicht mehr benötigen.


1
Jede Bibliothek hat eine andere Funktion, die nicht unbedingt mit dem Proxy zusammenhängt
Arnold Roa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.