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?

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.


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.


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