Como soluciono problemas de erros 504 retornados ao usar um Classic Load Balancer?

4 minuto de leitura
0

Vejo erros HTTP 504 nos registros de acesso do Classic Load Balancer, nas métricas do Amazon CloudWatch ou ao me conectar ao meu serviço por meio de um Classic Load Balancer.

Resolução

Um erro HTTP 504 é um código de status HTTP que indica que o tempo limite de um gateway ou proxy atingiu o tempo limite. Ao solucionar problemas, investigue o seguinte:

Verifique o tempo limite de inatividade do seu balanceador de carga e modifique, se necessário

O motivo mais comum para um erro HTTP 504 é que uma instância correspondente não respondeu à solicitação dentro do tempo limite de inatividade configurado. Por padrão, o tempo limite de inatividade do Classic Load Balancer é de 60 segundos.

Se as métricas do CloudWatch estiverem ativadas, verifique as métricas do CloudWatch para seu balanceador de carga. Quando os pontos de dados de latência são iguais ao valor de tempo limite do balanceador de carga configurado e o HTTPCode_ELB_5XX tem pontos de dados, pelo menos uma solicitação atingiu o tempo limite.

Para resolver isso, você pode fazer uma das duas coisas:

  • Modifique o tempo limite de inatividade do seu balanceador de carga para que a solicitação HTTP seja concluída dentro do período de tempo limite de inatividade.
  • Ajuste seu aplicativo para responder mais rapidamente.

Verifique se suas instâncias de back-end mantêm as conexões abertas

Quando a instância de back-end fecha uma conexão TCP com o balanceador de carga antes de atingir seu valor de tempo limite de inatividade, um erro HTTP 504 pode ser exibido.

Para resolver isso, ative as configurações de manutenção de atividade em suas instâncias de back-end e, em seguida, defina o tempo limite de manutenção de atividade para um valor maior que o tempo limite de inatividade do balanceador de carga.

(Somente Apache) Desative o TCP_DEFER_ACCEPT

Quando o TCP_DEFER_ACCEPT é ativado para instâncias de back-end do Apache, o balanceador de carga inicia uma conexão enviando um SYN para a instância de back-end. A instância de back-end então responde com um SYN-ACK e o balanceador de carga envia um ACK vazio para a instância de back-end.

Como o último ACK está vazio, o back-end não aceita o ACK e, em vez disso, reenvia um SYN-ACK para o balanceador de carga. Isso pode resultar em um tempo limite subsequente de nova tentativa SYN. Quando o FIN ou o RST não são enviados antes que a instância de back-end feche a conexão, o balanceador de carga considera a conexão estabelecida, mas ela não é. Então, quando o balanceador de carga envia solicitações por meio dessa conexão TCP, o back-end responde com um RST, gerando um erro 504.

Para resolver isso, defina acceptFilter http e acceptFilter https como none.

(Somente Apache) Desative o MPM de eventos e configure de forma otimizada os MPMs de pré-bifurcação e de trabalho

É uma prática recomendada desativar o MPM de eventos em instâncias de back-end registradas em um balanceador de carga. Como o back-end do Apache fecha conexões dinamicamente, essas conexões fechadas podem resultar em erros HTTP 504.

Para obter o desempenho ideal ao usar os MPMs prefork e de worker, e presumindo que o balanceador de carga esteja configurado com um tempo limite de inatividade de 60 segundos, use estes valores:

MPM mod_preforkMPM mod_worker
Tempo limite6565
KeepAliveTimeout6565
KeepAliveOnOn
MaxKeepAliveRequests100000
AcceptFilter httpnonenone
AcceptFilter httpsnonenone

Informações relacionadas

Monitorar seu balanceador de carga clássico

Solucionar problemas com um balanceador de carga clássico: erros HTTP

Quais são as configurações ideais para usar o Apache ou o NGINX como servidor de back-end para o ELB?

AWS OFICIAL
AWS OFICIALAtualizada há um ano