Page d'erreur de secours local Nginx si la destination proxy n'est pas disponible

9

Je transmets des demandes à un service local via un serveur Nginx. Ce que j'essaie maintenant d'accomplir, c'est de revenir à une page d'erreur locale au cas où le service deviendrait indisponible.

Ma configuration actuelle est

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;
    }
}

Le proxy fonctionne, mais dès que je rend mon service sur 9080 indisponible, l'index.html de mon emplacement de maintenance n'est PAS affiché.

Des suggestions sur ce qui ne va pas avec cette config?

Dennis Winter
la source

Réponses:

12

En fait, je n'ai eu qu'à modifier légèrement votre configuration:

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

et renommez évidemment celui que index.htmlvous souhaitez présenter 500.html.

des noisettes
la source
1
En utilisant cette approche, que se passe-t-il lorsque l'application exécutée sur le proxy_pass envoie un 501, 502 ou 503? Certaines applications (comme Django) gèrent leurs propres erreurs 50x afin qu'elles puissent avoir des pages d'erreur personnalisées. L'approche ici l'emportera-t-elle sur les pages d'erreur 50x générées par l'application avec la page Nginx 500.html?
Joe J
Je ne l'ai pas testé, mais je suis certain à 99%, que ces erreurs afficheront exactement le /500.html. L'idée est que lorsque nginx obtient 501 502 503 du serveur mandaté, il affichera /500.html. Le serveur proxy étant django.
noix
1

Essayez de spécifier l'URL exacte de la page d'erreur comme:

    proxy_intercept_errors on;
    error_page  500 502 503 504 402 403 401  /500.html;
    root   /locust/www/fallback/htdocs;
Andrei Mikhaltsov
la source
Nan. :( J'ai essayé vos changements de configuration dans les deux endroits mais sans succès.
Dennis Winter