Configurando o nginx para tentar novamente um único servidor upstream

9

Estou usando nginx como um proxy reverso e gostaria que ele esperasse alguns segundos e tente novamente uma solicitação se o servidor upstream não estiver respondendo. Dessa forma, posso reiniciar meu servidor upstream e, em vez de os usuários verem o 502 gateway inválido, seus navegadores ficam pendurados por alguns segundos (o processo de reinicialização leva 3 ou 4 segundos). Eu tentei algumas coisas, eu coloquei isso no meu bloco de servidor:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

mas não parece fazer nada. Eu também tentei adicionar isso ao bloco upstream:

server 127.0.0.1:3001 fail_timeout=10s;

novamente, não é o que eu queria.

Isso é possível? O que estou perdendo?

    
por John 25.04.2014 / 17:47

2 respostas

1

As diretivas que você tentou são destinadas a coisas diferentes daquelas que você deseja. Leia a documentação deles.

A documentação da diretiva upstream explica detalhadamente como funciona um bloco upstream:

If an error occurs during communication with a server, the request will be passed to the next server, and so on until all of the functioning servers will be tried. If a successful response could not be obtained from any of the servers, the client will receive the result of the communication with the last server.

Tudo dito lá.

No entanto, você pode processar o código de erro retornado do back-end interceptando-o com proxy_intercept_errors e, em seguida, envie o $request_uri para um script especial que lide com ele em seu nome do cliente original.

A linha de base é: você precisa de alguma lógica de código / aplicativo para repetir o lado do cliente (ou front-end).

    
por 05.11.2014 / 11:27
0

Como afirmado em outra resposta, não há uma maneira interna de fazer o nginx fazer isso. Uma solução possível é usar uma configuração de balanceamento de carga que consiste em seu servidor atual e um servidor de backup que faça o seguinte para todas as solicitações:

  • pesquise seu servidor atual até que ele esteja on-line novamente
  • responda com um 302 ou outro redirecionamento para que o navegador tente novamente

Este servidor seria marcado com o sinalizador 'backup' para que seja tentado apenas quando todos os outros servidores estiverem offline ( Balanceamento de carga HTTP > Pesos de servidor ).

    
por 05.03.2018 / 21:25

Tags