Você está vendo a documentação do Apigee Edge.
Acesse a
documentação da Apigee X. informações
Sintoma
O aplicativo cliente recebe um código de status HTTP de 504
com a mensagem Gateway Timeout
em resposta a chamadas de API.
Essa resposta de erro indica que o cliente não recebeu uma resposta em tempo hábil do Apigee Edge ou do servidor de back-end durante a execução de uma chamada de API.
Mensagem de erro
O aplicativo cliente recebe este código de resposta:
HTTP/1.1 504 Gateway Time-out
Ao chamar esse proxy usando cURL ou um navegador da Web, talvez você receba o seguinte erro:
<!DOCTYPE html> <html> <head> <title>Error</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>An error occurred.</h1> <p>Sorry, the page you are looking for is currently unavailable.<br/> Please try again later.</p> </body> </html>
O que causa os tempos limite?
O caminho típico para uma solicitação de API pela plataforma Edge é Cliente > Roteador > Processador de mensagens > Servidor de back-end, conforme mostrado na figura a seguir:
Todos os componentes no fluxo de ambiente de execução do Apigee Edge, incluindo clientes, roteadores, processadores de mensagens e servidores de back-end, são configurados com valores de tempo limite padrão adequados para garantir que as solicitações de API não demorem muito para serem concluídas. Se algum dos componentes no
fluxo não receber a resposta do componente upstream no período de tempo especificado na
configuração de tempo limite, o componente específico atingirá o tempo limite e normalmente retornará um
erro 504 Gateway Timeout
.
Este playbook descreve como solucionar problemas e resolver um erro 504
causado quando
o roteador expira.
Tempo limite do roteador
O tempo limite padrão configurado nos roteadores do Apigee Edge é de 57 segundos. Essa é a quantidade máxima de tempo que um proxy de API pode ser executado a partir do momento em que a solicitação de API é recebida no Edge até que a resposta seja enviada de volta, incluindo a resposta de back-end e todas as políticas que são executadas. O tempo limite padrão pode ser substituído nos roteadores/hosts virtuais, conforme explicado em Como configurar o tempo limite de E/S em roteadores.
Causas possíveis
No Edge, as causas típicas para o erro 504 Gateway Timeout
causado devido ao
tempo limite do roteador são:
Causa | Descrição | Instruções de solução de problemas aplicáveis para |
---|---|---|
Configuração incorreta de tempo limite no roteador | Isso acontece quando o roteador está configurado com um tempo limite de E/S incorreto. | Usuários de nuvens públicas e privadas de borda |
Etapas comuns do diagnóstico
Use uma das seguintes ferramentas/técnicas para diagnosticar esse erro:
- Monitoramento de APIs
- Registros de acesso do NGINX
Monitoramento de APIs
Para diagnosticar o erro usando o monitoramento de APIs:
- Navegue até a página Analisar > Monitoramento de API > Investigar.
- Filtre por
5xx
erros e selecione o período. - Trace Status Code em relação a Time.
-
Clique na célula específica que mostra erros
504
para mais detalhes e conferir registros sobre esses erros, conforme mostrado abaixo:Exemplo de erro 504
- No painel à direita, clique em View logs.
Na janela Registros de tráfego, observe os seguintes detalhes de alguns erros
504
:- Solicitação:fornece o método de solicitação e o URI usados para fazer as chamadas.
- Tempo de resposta:informa o tempo total decorrido para a solicitação.
No exemplo acima,
- A solicitação está apontando para
GET /test-timeout
. - O Tempo de resposta é de
57.001
segundos. Isso indica que o roteador expirou antes que o processador de mensagens pudesse responder, já que o valor está muito próximo do tempo limite padrão de E/S definido no roteador, que é de 57 segundos.
Também é possível conseguir todos os registros usando a API Monitoring GET logs. Por exemplo, ao consultar os registros de
org
,env
,timeRange
estatus
, você poderá fazer o download de todos os registros de transações em que o cliente expirou.Como o Monitoramento de API define o proxy como
-
(não definido) para esses erros504
, é possível usar a API (API Logs) para conseguir o proxy associado ao host virtual e ao caminho.For example :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- Revise o Tempo de resposta para ver outros erros
504
e verifique se o Tempo de resposta é consistente (valor de tempo limite de E/S definido no roteador, que é de 57 segundos) em todos os erros504
.
Registros de acesso do NGINX
Para diagnosticar o erro usando os registros de acesso do NGINX:
- Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Pesquise se há erros
504
durante um período específico (se o problema ocorreu anteriormente) ou se há alguma solicitação que ainda falha com504
. - Observe as seguintes informações para alguns erros
504
:- Tempo de resposta
- URI da solicitação
Neste exemplo, temos as seguintes informações:
-
Tempo da solicitação:
57.001
segundos. Isso indica que o roteador expirou após 57.001 segundos. - Solicitação:
GET /test-timeout
- Alias do host:
myorg-test.apigee.net
-
Verifique se o Tempo da solicitação é o mesmo que o tempo limite de E/S configurado no roteador/host virtual. Em caso afirmativo, isso significa que o roteador expirou antes de o processador de mensagens não responder dentro desse período.
No exemplo de entrada do registro de acesso do NGINX mostrado acima, o Tempo da solicitação de
57.001
segundos está muito próximo do tempo limite padrão de E/S definido no roteador. Isso indica claramente que o roteador expirou antes que o processador de mensagens pudesse responder. - Determine o proxy de API para o qual a solicitação foi feita usando o caminho base no campo Solicitação .
Causa: configuração incorreta de tempo limite no roteador
Diagnóstico
- Determine se os erros
504
são causados porque o roteador expirou antes que o processador de mensagens pudesse responder. Para fazer isso, verifique se o Tempo de resposta no Monitoramento da API/Tempo de solicitação no roteador (os dois campos representam as mesmas informações, mas são chamados por nomes diferentes) é o mesmo que o tempo limite de E/S configurado no roteador/host virtual e se os campos Origem de falha, Proxy de falha e Código de falha estão definidos como-
usando os registros de diagnóstico comum do Monitoramento de API ou do NGINX, conforme explicado em -
Verifique se o valor de tempo limite de E/S configurado no roteador ou no host virtual específico é menor em comparação com o valor configurado no processador de mensagens ou no proxy de API específico.
Para fazer isso, siga as etapas desta seção.
Como verificar o tempo limite de E/S em hosts virtuais
interface do Edge
Para verificar o tempo limite do host virtual usando a IU do Edge, faça o seguinte:
- Faça login na interface do Edge.
- Acesse Administrador > Hosts virtuais.
- Selecione o Ambiente específico em que você está enfrentando o problema de tempo limite.
- Selecione o host virtual específico para o qual você quer verificar o valor de tempo limite de E/S.
- Em Propriedades, veja o valor Tempo limite de leitura do proxy em segundos.
No exemplo acima, o Tempo limite de leitura do proxy está configurado com um valor
120
. Isso significa que o tempo limite de E/S configurado neste host virtual é de 120 segundos.
APIs de gerenciamento
Você também pode verificar o tempo limite de leitura do proxy usando as seguintes APIs de gerenciamento:
-
Execute a API Get virtual host para ver a configuração
virtualhost
, conforme mostrado abaixo:Usuário da nuvem pública
curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
Usuário da nuvem privada
curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
Em que:
ORGANIZATION_NAME é o nome da organização.
ENVIRONMENT_NAME é o nome do ambiente;
VIRTUALHOST_NAME é o nome do host virtual.
-
Verificar o valor configurado para a propriedade
proxy_read_timeout
Exemplo de definição de host virtual
{ "hostAliases": [ "api.myCompany,com", ], "interfaces": [], "listenOptions": [], "name": "secure", "port": "443", "retryOptions": [], "properties": { "property": [ { "name": "proxy_read_timeout", "value": "120" } ] }, "sSLInfo": { "ciphers": [], "clientAuthEnabled": "false", "enabled": "true", "ignoreValidationErrors": false, "keyAlias": "myCompanyKeyAlias", "keyStore": "ref://myCompanyKeystoreref", "protocols": [] }, "useBuiltInFreeTrialCert": false }
No exemplo acima,
proxy_read_timeout
é configurado com um valor120
. Isso significa que o tempo limite de E/S configurado nesse host virtual é de 120 segundos.
Como verificar o tempo limite de E/S no arquivo Router.properties
- Faça login em uma máquina roteador.
- Pesquise a propriedade
proxy_read_timeout
no diretório/opt/nginx/conf.d
e verifique se ela foi definida com o novo valor da seguinte maneira:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
Verifique o valor definido para a propriedade
proxy_read_timeout
no arquivo de configuração de host virtual específico.Exemplo de resultado do comando grep
/opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57; /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
No exemplo de saída acima, observe que a propriedade
proxy_read_timeout
foi definida com o novo valor57
em0-default.conf
, que é o arquivo de configuração do host virtual padrão. Isso indica que o tempo limite de E/S está configurado para 57 segundos no roteador do host virtual padrão. Se você tiver vários hosts virtuais, verá essas informações para cada um deles. Consiga o valor deproxy_read_timeout
para o host virtual específico usado para fazer as chamadas de API que falharam com erros504
.
Verificar o tempo limite de E/S no proxy de API
Você pode ver o tempo limite de E/S no seguinte:
- Endpoint de destino do proxy de API
- Política ServiceFrase de destaque do proxy de API
Ver o tempo limite de E/S no endpoint de destino do proxy de API
- Na interface do Edge, selecione o proxy de API específico em que você quer ver o valor do tempo limite de E/S.
- Selecione o endpoint de destino específico que você quer verificar.
- Veja a propriedade
io.timeout.millis
com um valor adequado no elemento<HTTPTargetConnection>
na configuração deTargetEndpoint
.Por exemplo, o tempo limite de E/S no código a seguir é definido como 120 segundos:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
Ver o tempo limite de E/S na política Service callout do proxy de API
- Na interface do Edge, selecione o proxy de API específico em que você quer ver o novo valor de tempo limite de E/S para a política Servicecitação.
- Selecione a política Servicecitação específica que você quer verificar.
-
Veja o elemento
<Timeout>
com um valor apropriado na configuração<ServiceCallout>
.Por exemplo, o tempo limite de E/S do código a seguir será de 120 segundos:
<Timeout>120000</Timeout>
Verificar o tempo limite de E/S nos processadores de mensagens
- Faça login na máquina do processador de mensagens.
-
Pesquise a propriedade
HTTPTransport.io.timeout.millis
no diretório/opt/apigee/edge-message-processor/conf
usando o seguinte comando:grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
Exemplo de saída
/opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
- No exemplo de saída acima, observe que a propriedade
HTTPTransport.io.timeout.millis
foi definida com o valor55000
emhttp.properties
. Isso indica que o tempo limite de E/S foi configurado com sucesso para 55 segundos no processador de mensagens.
Depois de determinar o tempo limite configurado no roteador e no processador de mensagens, verifique se o roteador/host virtual foi configurado com um valor de tempo limite menor em comparação com o do processador de mensagens/proxy de API.
Anote os valores definidos em todas as camadas, conforme mostrado na tabela abaixo:
Tempo limite do roteador (segundos) | Tempo limite no host virtual (segundos) | Tempo limite no processador de mensagens (segundos) | Tempo limite no proxy de API (segundos) |
---|---|---|---|
57 | - | 55 | 120 |
Nesse exemplo,
- O valor padrão de 57 segundos é configurado no roteador.
- O valor de tempo limite não está definido no host virtual específico. Isso significa que ele usará o valor padrão de 57 segundos configurado no próprio roteador.
- No processador de mensagens, o valor padrão de 55 segundos é configurado.
- No entanto, no proxy de API específico, o valor de 120 segundos é configurado.
Observe que o valor de tempo limite maior é configurado apenas no proxy de API, mas o roteador ainda é configurado com 57 segundos. Portanto, o roteador expira em 57 segundos enquanto o processador/back-end de mensagens ainda processa sua solicitação. Isso faz com que o roteador responda com o erro 504 Gateway Timeout
ao aplicativo cliente.
Resolução
Siga as etapas abaixo para configurar o tempo limite de E/S adequado no roteador e no processador de mensagens para resolver esse problema.
- Consulte Práticas recomendadas para configurar o tempo limite de E/S para entender quais valores de tempo limite precisam ser definidos em diferentes componentes envolvidos no fluxo de solicitação de API pelo Apigee Edge.
- No exemplo acima, se você determinar que um valor de tempo limite mais alto precisa ser definido porque o servidor de back-end requer mais tempo e tiver aumentado o valor de tempo limite do processador de mensagens para 120 segundos, defina um valor de tempo limite maior. Por exemplo:
123 seconds
no roteador. Para evitar o impacto em todos os proxies de API devido ao novo valor de tempo limite, defina o valor de123 seconds
somente no host virtual específico usado no proxy de API específico. - Siga as instruções em Como configurar o tempo limite de E/S em roteadores para definir o tempo limite no host virtual.