Configurando o nginx para tentar novamente um único servidor upstream

14

Estou usando o nginx como um proxy reverso e gostaria que esperasse alguns segundos e tente novamente uma solicitação se o servidor upstream não estiver respondendo. Dessa forma, posso reiniciar o servidor upstream e, em vez de os usuários verem o gateway 502 inválido, os navegadores ficam travados 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 parecia 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?

John
fonte

Respostas:

1

As diretrizes que você tentou destinam-se a coisas diferentes do que você deseja. Leia a documentação deles.

A upstreamdocumentação da diretiva explica completamente como funciona um bloco upstream:

Se ocorrer um erro durante a comunicação com um servidor, a solicitação será passada para o próximo servidor e assim por diante até que todos os servidores funcionantes sejam tentados. Se não for possível obter uma resposta bem-sucedida de nenhum dos servidores, o cliente receberá o resultado da comunicação com o último servidor.

Tudo dito lá.

No entanto, você pode processar o código de erro retornado do back-end interceptando-o proxy_intercept_errorse enviando-o $request_uripara um script especial que lida com ele em nome do cliente original.

A linha de base é: você precisa de alguma lógica de código / aplicativo para tentar novamente no lado do cliente (ou no frontend).

Bernard Rosset
fonte
0

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

  • sondar seu servidor atual até que esteja on-line novamente
  • em seguida, responda com um redirecionamento 302 ou outro para que o navegador tente novamente

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

user987356
fonte