Código de status HTTP 504 (tempo limite do gateway) - Amazon CloudFront

Código de status HTTP 504 (tempo limite do gateway)

Um código de status HTTP 504 (tempo limite do gateway) indica que quando o CloudFront encaminhou uma solicitação para a origem (porque o objeto solicitado não estava no cache de borda), ocorreu uma das seguintes situações:

  • A origem retornou um código de status HTTP 504 para o CloudFront.

  • A origem não respondeu antes que a solicitação expirasse.

O CloudFront retornará um código de status HTTP 504 se o tráfego estiver bloqueado para a origem por um firewall ou por um grupo de segurança, ou se a origem não estiver acessível na internet. Verifique esses problemas primeiro. Em seguida, se o acesso não for o problema, explore os atrasos dos aplicativos e os tempos limite do servidor para ajudar você a identificar e corrigir os problemas.

Configurar o firewall no servidor de origem para permitir o tráfego do CloudFront

Se o firewall no servidor de origem bloquear o tráfego do CloudFront, o CloudFront retornará um código de status HTTP 504. Portanto, verifique se o problema não é esse antes de verificar outros problemas.

O método usado para determinar se isso é um problema com o firewall depende do sistema usado pelo servidor de origem:

  • Se você usar um firewall IPTable em um servidor Linux, poderá pesquisar ferramentas e informações para ajudá-lo a trabalhar com IPTables.

  • Se você utiliza o Firewall do Windows em um servidor Windows, consulte Adicionar ou editar regras de firewall, na documentação da Microsoft.

Ao avaliar a configuração do firewall no servidor de origem, procure por firewalls ou regras de segurança que bloqueiam o tráfego dos pontos de presença do CloudFront, com base no intervalo de endereços IP publicado.

Se o intervalo de endereços IP do CloudFront tiver permissão para se conectar ao seu servidor de origem, certifique-se de atualizar as regras de segurança do seu servidor para incorporar as alterações. Você pode assinar um tópico do Amazon SNS e receber notificações quando o arquivo de intervalo de endereços IP for atualizado. Depois de receber a notificação, você poderá usar o código para recuperar o arquivo, analisá-lo e fazer ajustes de acordo com o seu ambiente local. Para obter mais informações, consulte Assinar alterações de endereços IP público da AWS via Amazon SNS, no blog de notícias da AWS.

Configure os grupos de segurança no servidor de origem para permitir o tráfego do CloudFront

Se a origem usar o Elastic Load Balancing, revise os grupos de segurança do ELB e verifique se os grupos de segurança permitem o tráfego de entrada no CloudFront.

É possível usar o AWS Lambda para atualizar seus grupos de segurança automaticamente e permitir o tráfego de entrada do CloudFront.

Torne seu servidor de origem personalizado acessível na Internet

Se o CloudFront não puder acessar o servidor de origem personalizado porque não está disponível publicamente na Internet, o CloudFront retornará um erro HTTP 504.

Os pontos de presença do CloudFront se conectam aos servidores de origem por meio da Internet. Se a origem personalizada estiver em uma rede privada, o CloudFront não poderá acessá-la. Por causa disso, não é possível usar servidores privados, incluindo Classic Load Balancers internos, como servidores de origem do CloudFront.

Para verificar se o tráfego da Internet pode se conectar ao seu servidor de origem, execute os seguintes comandos (em que OriginDomainName é o nome de domínio do servidor):

Para tráfego de HTTP:

  • nc -zv OriginDomainName 443

  • telnet OriginDomainName 443

Para tráfego HTTP:

  • nc -zv OriginDomainName 80

  • telnet OriginDomainName 80

Encontre e corrija respostas atrasadas de aplicações no seu servidor de origem

Os tempos limite do servidor geralmente são resultado de um aplicativo que demora muito tempo para responder ou de um valor de tempo limite definido como muito baixo.

Uma solução rápida para ajudar a evitar erros HTTP 504 é definir um valor maior para o tempo limite do CloudFront para a distribuição. Mas recomendamos que você primeiro verifique se há problemas de performance e latência com o aplicativo e o servidor de origem. Em seguida, você pode definir um valor de tempo limite razoável que ajuda a evitar erros HTTP 504 e fornece boa capacidade de resposta para os usuários.

Veja a seguir uma visão geral das etapas que você pode realizar para encontrar problemas de performance e corrigi-los:

  1. Meça a latência típica e de alta carga (capacidade de resposta) do seu aplicativo web.

  2. Adicione outros recursos, como CPU ou memória, se necessário. Tome outras medidas para resolver problemas, como ajuste de consultas de banco de dados para acomodar cenários de alta carga.

  3. Se necessário, ajuste o valor de tempo limite para sua distribuição do CloudFront.

Veja a seguir os detalhes sobre cada etapa.

Meça a latência típica e de alta carga

Para determinar se um ou mais servidores de aplicativos web de backend estão com alta latência, execute o seguinte comando "curl" do Linux em cada servidor:

curl -w "Connect time: %{time_connect} Time to first byte: %{time_starttransfer} Total time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject

nota

Se executar o Windows nos servidores, você poderá procurar e fazer download do "curl" para que o Windows execute um comando semelhante.

Conforme você mede e avalia a latência de um aplicativo executado no seu servidor, lembre-se do seguinte:

  • Os valores de latência são relativos a cada aplicativo. No entanto, um tempo até o primeiro byte em milissegundos, em vez de segundos ou mais, é razoável.

  • Se você medir a latência do aplicativo com carga normal e ela estiver boa, os visualizadores ainda poderão se deparar com tempo limite com alta carga. Quando há alta demanda, os servidores podem ter respostas atrasadas ou nem retornar respostas. Para ajudar a evitar problemas de latência de alta carga, verifique os recursos do seu servidor, como leituras e gravações de CPU e memória e disco, para garantir que seus servidores tenham a capacidade de se expandir para alta carga.

    Você pode executar o seguinte comando do Linux para verificar a memória usada pelos processos do Apache:

    watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"

  • A alta utilização da CPU no servidor pode reduzir significativamente a performance de um aplicativo. Se você usar uma instância do Amazon EC2 para o servidor de backend, revise as métricas do CloudWatch para o servidor verificar a utilização da CPU. Para obter mais informações, consulte o Guia do usuário do Amazon CloudWatch. Se você estiver usando seu próprio servidor, consulte a documentação de ajuda do servidor para obter instruções sobre como verificar a utilização da CPU.

  • Verifique outros problemas possíveis com cargas altas, como consultas de banco de dados que são executadas lentamente quando há um grande volume de solicitações.

Adicione recursos e ajuste servidores e bancos de dados

Depois de avaliar a capacidade de resposta dos seus aplicativos e servidores, verifique se há recursos suficientes para tráfego típico e situações de carga alta:

  • Se você tiver seu próprio servidor, verifique se ele tem espaço em disco, CPU e memória suficiente para lidar com solicitações do visualizador, com base na sua avaliação.

  • Se você usar uma instância do Amazon EC2 como o servidor de backend, verifique se o tipo de instância tem os recursos apropriados para atender às solicitações de entrada. Para obter mais informações, consulte Tipos de instância, no Guia do usuário do Amazon EC2.

Além disso, considere as seguintes etapas para ajudar a evitar tempos limite:

  • Se o valor de tempo para o primeiro byte retornado pelo comando "curl" for alto, execute etapas para melhorar a performance do seu aplicativo. Melhorar a capacidade de resposta do aplicativo ajudará a reduzir os erros de tempo limite.

  • Ajuste as consultas de banco de dados para garantir que elas manipulem volumes altos de solicitações sem performance lenta.

  • Configure as conexões keep-alive (persistente) no seu servidor de backend. Essa opção ajuda a evitar latências que ocorrem quando as conexões precisam ser restabelecidas para solicitações ou usuários subsequentes.

  • Se você usar o ELB como origem, saiba como reduzir a latência analisando as sugestões neste artigo da Central de Conhecimento: Como solucionar problemas de alta latência no meu ELB Classic Load Balancer?

Se necessário, ajuste o valor de tempo limite do CloudFront

Se tiver avaliado e corrigido a performance lenta da aplicação, a capacidade do servidor de origem e outros problemas, mas os visualizadores ainda estiverem enfrentando erros HTTP 504, considere a possibilidade de alterar o tempo especificado no tempo limite de resposta de origem na sua distribuição. Para saber mais, consulte Tempo limite de resposta (somente origens personalizadas).