Página de error de reserva local de Nginx si el destino del proxy no está disponible

9

Estoy reenviando solicitudes a un servicio local a través de un servidor Nginx. Lo que intento lograr ahora es recurrir a una página de error local en caso de que el servicio no esté disponible.

Mi configuración actual es

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

El proxy funciona, pero tan pronto como hago que mi servicio en 9080 no esté disponible, el index.html de mi ubicación de mantenimiento NO se muestra.

¿Alguna sugerencia sobre lo que está mal con esta configuración?

Dennis Winter
fuente

Respuestas:

12

En realidad, solo tuve que modificar ligeramente su configuración:

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

y obviamente renombra el index.htmlque quieres presentar 500.html.

nueces
fuente
1
Con este enfoque, ¿qué sucede cuando la aplicación que se ejecuta en proxy_pass arroja un 501, 502 o 503? Algunas aplicaciones (como Django) manejan sus propios errores 50x para que puedan tener páginas de error personalizadas. ¿El enfoque aquí prevalecerá sobre la aplicación que generó 50 páginas de error con la página Nginx 500.html?
Joe J
No lo he probado, pero estoy 99% seguro de que exactamente esos errores mostrarán /500.html. La idea es que cuando nginx obtenga 501 502 503 del servidor proxy, mostrará /500.html. El servidor proxy es django.
nueces
1

Intente especificar la URL exacta para la página de error como:

    proxy_intercept_errors on;
    error_page  500 502 503 504 402 403 401  /500.html;
    root   /locust/www/fallback/htdocs;
Andrei Mikhaltsov
fuente
No :( Intenté los cambios de configuración en ambas ubicaciones pero no tuve éxito.
Dennis Winter