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. Então, se o acesso não for o problema, explore os atrasos das aplicações e os tempos limite do servidor para ajudar a identificar e corrigir os problemas.
Tópicos
Configurar o firewall no servidor de origem para permitir o tráfego do CloudFront
Configure os grupos de segurança no servidor de origem para permitir o tráfego do CloudFront
Torne seu servidor de origem personalizado acessível na Internet
Encontre e corrija respostas atrasadas de aplicações no seu servidor de origem
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, este retornará um código de status HTTP 504. Portanto, verifique se o problema não é esse antes de examinar outras possibilidades.
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. Para ter mais informações, consulte Localizações e intervalos de endereço IP dos servidores de borda do CloudFront.
Se o intervalo de endereços IP do CloudFront tiver permissão para se conectar ao servidor de origem, atualize as regras de segurança do 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
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 com o CloudFront.
Para conferir se o tráfego da Internet pode se conectar ao 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:
-
Meça a latência típica e de alta carga (capacidade de resposta) do seu aplicativo web.
-
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.
-
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 "DNS Lookup Time: %{time_namelookup} \nConnect time: %{time_connect} \nTLS Setup: %{time_appconnect} \nRedirect Time: %{time_redirect} \nTime to first byte: %{time_starttransfer} \nTotal 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 da aplicação 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 servidor, como leituras e gravações de CPU e memória e disco, para garantir que os servidores tenham a capacidade de escalar 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 uma aplicação. 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. Ou se você estiver usando seu próprio servidor, consulte a respectiva documentação de ajuda para ter instruções sobre como conferir 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á 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 ter mais informações, consulte Instance types, 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 Elastic Load Balancing como origem, as causas de um erro 504 são as seguintes:
-
O balanceador de carga não conseguiu estabelecer conexão com o destino antes do término do tempo limite de conexão (dez segundos).
-
O balanceador de carga estabelece uma conexão com o destino, mas o destino não responde antes de decorrido o período de tempo limite de inatividade.
-
A lista de controle de acesso (ACL) da rede para a sub-rede não permite tráfego dos destinos para os nós do balanceador de carga nas portas efêmeras (1024-65535).
-
O destino retorna um cabeçalho content-length maior do que o corpo da entidade. O balanceador de carga atinge o tempo limite enquanto aguarda pelos bytes ausentes.
-
O destino é uma função do Lambda e o Lambda não responde antes do término do tempo limite de conexão.
Para ter mais informações sobre como reduzir a latência, consulte Como soluciono problemas de alta latência em meu Classic Load Balancer do ELB?
. -
-
Se você usa o MediaTailor como origem, as possíveis causas de um erro 504 são as seguintes:
-
Se os URLs relativos forem mal processados, o MediaTailor poderá receber URLs malformados dos jogadores.
-
Se o MediaPackage for a origem do manifesto do MediaTailor, os erros de manifesto 404 do MediaPackage poderão fazer com que o MediaTailor exiba um erro 504.
-
A solicitação para o servidor de origem do MediaTailor leva mais de dois segundos para ser concluída.
-
-
Se você usa o Amazon API Gateway como origem, uma possível causa do erro 504 é a seguinte:
-
Uma solicitação de integração demora mais do que o parâmetro de tempo limite máximo de integração da API REST do API Gateway. Para ter mais informações, consulte Como posso solucionar erros de tempo limite da API HTTP 504 com o API Gateway?
.
-
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 ter mais informações, consulte Tempo limite de resposta (somente origens de VPC e personalizadas).