mod_proxy gibt 503 Fehler zurück, auch nachdem der Proxy-Dienst gesichert wurde

7

Ich habe ein Setup mit Apache2 als Front-End-Server für mehrere Python-Apps, die von Gunicorn bereitgestellt werden . Mein Apache2-Setup mit mod_proxy sieht folgendermaßen aus:

<VirtualHost *:80>
    ServerName example.com
    UseCanonicalName On
    ServerAdmin webmaster@localhost

    LogLevel warn
    CustomLog /var/log/apache2/example.com/access.log combined
    ErrorLog /var/log/apache2/example.com/error.log
    ServerSignature On

    Alias /media/ /home/example/example.com/pysrc/project/media/

    ProxyPass /media/ !
    ProxyPass / http://127.0.0.1:4711/
    ProxyPassReverse / http://127.0.0.1:4711/
    ProxyPreserveHost On
    ProxyErrorOverride Off
</VirtualHost>

Im Allgemeinen funktioniert dieses Setup ziemlich gut. Ich habe jedoch ein Problem: Wenn ich den Gunicorn-Prozess neu starte (dauert 2-5 Sekunden) und eine Anfrage von Apache vorliegt, schlägt diese Anfrage mit einem 503-Fehler fehl. So weit, ist es gut. Aber Apache gibt immer wieder 503 Fehler zurück, selbst nachdem der Gunicorn-Prozess wieder aufgenommen wurde. Die Bereitstellung von Inhalten vom Proxyserver wird erst nach einem vollständigen Neustart von Apache fortgesetzt.

Gibt es einen Weg, um dieses Verhalten zu umgehen?

Benjamin Wohlwend
quelle

Antworten:

26

Fügen Sie retry=0Ihren ProxyPass-Zeilen Folgendes hinzu:

ProxyPass / http://127.0.0.1:4711/ retry=0

Aus der mod_proxy-Dokumentation :

Zeitlimit für Wiederholungspool-Worker in Sekunden. Wenn sich der Verbindungspool-Worker zum Back-End-Server im Fehlerzustand befindet, leitet Apache keine Anforderungen an diesen Server weiter, bis das Zeitlimit abgelaufen ist. Auf diese Weise können Sie den Back-End-Server für Wartungszwecke herunterfahren und später wieder online schalten. Ein Wert von 0 bedeutet, dass Mitarbeiter immer in einem Fehlerzustand ohne Zeitüberschreitung erneut versucht werden.

TimS
quelle
Ich danke dir sehr! Funktioniert perfekt :) Sie erhalten das Kopfgeld in ein paar Stunden, wenn ich es vergeben darf.
Benjamin Wohlwend
Ich glaube, Sie möchten jetzt stattdessen diesen Link - der zitierte Absatz scheint in der in der Antwort verlinkten Version zu fehlen, und die retryOption wird nicht erwähnt . Für andere, die sich das Gleiche fragen: Der Standardwert für diesen Parameter beträgt 60 Sekunden.
Gijs
-1

Befolgen Sie die dokumentierte Methode zum Neustart von Gunicorn?

Ich würde einen einfachen Ansatz empfehlen. Wenn 2-5 Sekunden in Ihrer Umgebung akzeptable Ausfallzeiten sind, kann ich dann vorschlagen, einfach den Apache-Dienst per Skript zu erstellen, um sofort nach dem Neustart Ihres Gunicorn-Dienstes neu zu starten?

In einer Produktionsumgebung würde ich vorschlagen, HAProxy anstelle von Apache als Front-End zu verwenden, und Sie haben möglicherweise viel besseres Glück.

Matt Beckman
quelle
Danke für deine Antwort! Ich benutze Supervisord , um meine Gunicorn-Prozesse zu steuern. Mein Aussehen ähnelt im supervisor.confGrunde dem Beispiel im Gunicorn-Repo . Leider kann ich mich aus organisatorischen Gründen nicht von Apache als Front-End-Server entfernen.
Benjamin Wohlwend