Lokale Nginx-Fallback-Fehlerseite, wenn das Proxy-Ziel nicht verfügbar ist

8

Ich leite Anfragen über einen Nginx-Server an einen lokalen Dienst weiter. Ich versuche jetzt, auf eine lokale Fehlerseite zurückzugreifen, falls der Dienst nicht mehr verfügbar ist.

Meine aktuelle Konfiguration ist

server {
    listen       80;
    server_name  "";

    location / {
        proxy_pass  http://127.0.0.1:9080;
        proxy_set_header    Host $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_connect_timeout 1;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;
        proxy_intercept_errors on;
    }

    error_page 501 502 503 @maintenance;
    location @maintenance {
            root   /locust/www/fallback/htdocs;
            index  index.html index.htm;
    }
}

Das Proxying funktioniert, aber sobald ich meinen Dienst auf 9080 nicht mehr verfügbar mache, wird die index.html meines Wartungsorts NICHT angezeigt.

Irgendwelche Vorschläge, was mit dieser Konfiguration nicht stimmt?

Dennis Winter
quelle

Antworten:

12

Eigentlich musste ich deine Konfiguration nur geringfügig ändern:

error_page 501 502 503 /500.html;
location = /500.html {
        root   /locust/www/fallback/htdocs;
}

und benennen index.htmlSie natürlich das um, dem Sie präsentieren möchten 500.html.

Nüsse
quelle
1
Was passiert bei diesem Ansatz, wenn die auf dem proxy_pass ausgeführte Anwendung eine 501, 502 oder 503 auslöst? Einige Anwendungen (wie Django) behandeln ihre eigenen 50-fachen Fehler, sodass sie benutzerdefinierte Fehlerseiten haben können. Wird der Ansatz hier die Anwendung übertreffen, die 50x Fehlerseiten mit der Seite Nginx 500.html generiert hat?
Joe J
Ich habe es nicht getestet, bin mir aber zu 99% sicher, dass genau diese Fehler die Datei /500.html anzeigen. Die Idee ist, dass wenn nginx 501 502 503 vom Proxyserver erhält, /500.html angezeigt wird. Der Proxy-Server ist Django.
Nüsse
1

Versuchen Sie, die genaue URL für die Fehlerseite wie folgt anzugeben:

    proxy_intercept_errors on;
    error_page  500 502 503 504 402 403 401  /500.html;
    root   /locust/www/fallback/htdocs;
Andrei Mikhaltsov
quelle
Nee. :( Ich habe versucht, Ihre Konfiguration an beiden Standorten zu ändern, aber kein Erfolg.
Dennis Winter