Página de erro de fallback local do Nginx se o destino do proxy não estiver disponível

9

Estou encaminhando solicitações para um serviço local por meio de um servidor Nginx. O que tento realizar agora é fazer o fallback para uma página de erro local, caso o serviço fique indisponível.

Minha configuração atual é

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

A proxy funciona, mas assim que meu serviço no 9080 não está disponível, o index.html do meu local de manutenção NÃO é exibido.

Alguma sugestão sobre o que há de errado com esta configuração?

Dennis Winter
fonte

Respostas:

12

Na verdade, eu apenas tive que modificar levemente sua configuração:

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

e, obviamente, renomeie o que index.htmlvocê deseja apresentar 500.html.

nozes
fonte
1
Usando essa abordagem, o que acontece quando o aplicativo em execução no proxy_pass lança um 501, 502 ou 503? Alguns aplicativos (como o Django) lidam com seus próprios erros de 50x para que eles possam ter páginas de erro personalizadas. A abordagem aqui supera o aplicativo gerado páginas de erro 50x com a página Nginx 500.html?
Joe J
Não testei, mas tenho 99% de certeza de que exatamente esses erros exibirão o /500.html. A idéia é que, quando o nginx estiver obtendo 501 502 503 do servidor proxy, ele exibirá /500.html. O servidor proxy sendo django.
porcas
1

Tente especificar o URL exato para a página de erro, como:

    proxy_intercept_errors on;
    error_page  500 502 503 504 402 403 401  /500.html;
    root   /locust/www/fallback/htdocs;
Andrei Mikhaltsov
fonte
Não. :( Eu tentei as alterações de configuração em ambos os locais, mas sem sucesso.
Dennis Inverno