504 Tempo limite do gateway - Tempo limite do roteador

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:

  1. Navegue até a página Analisar > Monitoramento de API > Investigar.
  2. Filtre por 5xx erros e selecione o período.
  3. Trace Status Code em relação a Time.
  4. 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

  5. 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 e status, 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 erros 504, é 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
    
  6. 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 erros 504.

Registros de acesso do NGINX

Para diagnosticar o erro usando os registros de acesso do NGINX:

  1. Verifique os registros de acesso do NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. 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 com 504.
  3. 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
  4. 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.

  5. 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

  1. 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
  2. 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:

  1. Faça login na interface do Edge.
  2. Acesse Administrador > Hosts virtuais.
  3. Selecione o Ambiente específico em que você está enfrentando o problema de tempo limite.
  4. Selecione o host virtual específico para o qual você quer verificar o valor de tempo limite de E/S.
  5. 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:

  1. 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.

  2. 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 valor 120. 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

  1. Faça login em uma máquina roteador.
  2. 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
    
  3. 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 valor 57 em 0-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 de proxy_read_timeout para o host virtual específico usado para fazer as chamadas de API que falharam com erros 504.

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
  1. Na interface do Edge, selecione o proxy de API específico em que você quer ver o valor do tempo limite de E/S.
  2. Selecione o endpoint de destino específico que você quer verificar.
  3. Veja a propriedade io.timeout.millis com um valor adequado no elemento <HTTPTargetConnection> na configuração de TargetEndpoint.

    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
  1. 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.
  2. Selecione a política Servicecitação específica que você quer verificar.
  3. 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

  1. Faça login na máquina do processador de mensagens.
  2. 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
    
  3. No exemplo de saída acima, observe que a propriedade HTTPTransport.io.timeout.millis foi definida com o valor 55000 em http.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.

  1. 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.
  2. 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 de 123 seconds somente no host virtual específico usado no proxy de API específico.
  3. Siga as instruções em Como configurar o tempo limite de E/S em roteadores para definir o tempo limite no host virtual.