504 Tempo limite do gateway - Tempo limite do roteador

Esta é a documentação do Apigee Edge.
Acesse 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 o servidor de back-end durante a execução de uma chamada de API.

Mensagem de erro

O aplicativo cliente recebe o seguinte 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 de uma solicitação de API pela plataforma de borda é Cliente > Roteador > Enviar mensagem Processador > Backend Server conforme mostrado na figura a seguir:

Todos os componentes no fluxo de ambiente de execução do Apigee Edge, incluindo clientes, roteadores, mensagens Os processadores e os servidores de back-end são configurados com valores de tempo limite padrão adequados para verifique se as solicitações de API não demoram muito para serem concluídas. Se algum dos componentes não recebem a resposta do componente upstream dentro do período especificado no configuração de tempo limite, o componente específico atingirá o tempo limite e normalmente retornará uma 504 Gateway Timeouterro.

Este playbook descreve como resolver problemas e resolver um erro 504 causado quando tempo limite do roteador.

Tempo limite no roteador

O tempo limite padrão configurado em roteadores no Apigee Edge é de 57 segundos. Este é o máximo tempo que um proxy de API pode ser executado a partir do momento em que a solicitação de API é recebida no Edge até a resposta é 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 na Como configurar o tempo limite de E/S nos roteadores.

Causas possíveis

No Edge, as causas típicas do erro 504 Gateway Timeout causado pela O tempo limite do roteador é:

Causa Descrição Instruções de solução de problemas aplicáveis para
Configuração de tempo limite incorreta no roteador Isso acontece quando o roteador está configurado com um tempo limite de E/S incorreto. Usuários de nuvem pública e privada 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 a API Monitoring:

  1. Navegue até o menu Analisar > Monitoramento de APIs > Investigar.
  2. Filtre por 5xx erros e selecione o período.
  3. Relacione o Código de status com o Time.
  4. Clique na célula específica que mostra 504 erros para consultar mais detalhes sobre esses erros, conforme mostrado abaixo:

    Exemplo mostrando erros 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:fornece o tempo total decorrido da 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, pois o valor está muito próximo para o tempo limite padrão de E/S definido no roteador, que é 57 segundos.

    Também é possível acessar todos os registros com a API Monitoring GET logs. Por exemplo, ao consultar os registros de org, env, timeRange, e status, pode ser possível fazer o download de todos os registros de transações em que o tempo limite do cliente.

    Como a API Monitoring define o proxy como - (não definido) para esses 504 erros, você pode usar a API (Logs API) para receber o proxy associado do host virtual e do 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 para verificar se o Tempo de resposta é consistente (valor de tempo limite de E/S definido no roteador que é de 57 segundos) entre todos os erros 504.

Registros de acesso do NGINX

Para diagnosticar o erro usando 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 tiver acontecido no passado) ou se houver alguma solicitação que ainda esteja falhando com 504:
  3. Observe as seguintes informações para alguns erros 504:
    • Tempo de resposta
    • URI da solicitação

    Neste exemplo, vemos as seguintes informações:

    • Tempo da solicitação:57.001 segundos. Isso indica que o 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 de solicitação é o mesmo que o tempo limite de E/S configurados no roteador/host virtual. Se sim, isso significa que o roteador expirou antes que o O processador de mensagens não respondeu no período.

    No exemplo de entrada de registro de acesso do NGINX mostrado acima, o campo Request O tempo 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 atingiu o tempo limite antes que a mensagem O processador pode responder.

  5. Determine o proxy de API para o qual a solicitação foi feita usando o caminho base no Campo Request .

Causa: configuração de tempo limite incorreta no roteador

Diagnóstico

  1. Determine se os erros 504 são causados porque o tempo limite do roteador expirou antes o processador de mensagens poderá responder. Você pode fazer isso verificando se o Tempo de resposta em Monitoramento da API/Tempo de solicitação no roteador (ambos os campos) representam as mesmas informações,mas são chamadas por nomes diferentes) é o mesmo que o Tempo limite de E/S configurado no roteador/host virtual e nos campos Fault Source, Fault Proxy e Código de falha definidos como - usando a API Monitoring ou o acesso NGINX registros, conforme explicado nas Etapas comuns de diagnóstico.
  2. Verifique se o valor de tempo limite de E/S configurado no roteador ou no host virtual específico está menor em comparação ao configurado no processador de mensagens ou no proxy de API específico.

    Para 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 interface do Edge, faça o seguinte:

  1. Faça login na interface do Edge.
  2. Acesse Administrador > Hosts virtuais.
  3. Selecione um Ambiente específico no qual você está tendo o problema de tempo limite.
  4. Selecione o host virtual específico em que você quer verificar o valor do 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 o valor 120 Isso significa que o tempo limite de E/S configurado nesse 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 o Consiga a API virtual host para receber 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. Verifique 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 está configurado com um valor de 120. Isso significa que o tempo limite de E/S configurado neste host virtual é 120 segundos.

.

Como verificar o tempo limite de E/S no arquivo route.properties

  1. Faça login em uma máquina roteador.
  2. Pesquise a propriedade proxy_read_timeout na /opt/nginx/conf.d e verifique se ele foi definido com o novo valor. da seguinte forma:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Verifique o valor definido para a propriedade proxy_read_timeout no sistema virtual de configuração do host.

    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 tem foi definido com o novo valor 57 no 0-default.conf, que é o de configuração do host virtual padrão. Isso indica que o tempo limite de E/S foi configurado para 57 segundos no roteador para o host virtual default. Se você tiver vários hosts virtuais, você verá as informações de cada um deles. Descubra o valor de proxy_read_timeout para o host virtual específico usado para criar a API. chamadas que falharam com 504 erros.

Como verificar o tempo limite de E/S no proxy de API

Confira o tempo limite de E/S nas seguintes guias:

  • Endpoint de destino do proxy de API
  • Política Service callout do proxy de API
Conferir 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 visualizar a E/S valor de tempo limite.
  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> no TargetEndpoint configuração do Terraform.

    Por exemplo, o tempo limite de E/S no código a seguir está 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 visualizar a nova E/S de tempo limite para a política Service callout.
  2. Selecione a política ServiceCall específica que você quer verificar.
  3. Veja o elemento <Timeout> com um valor apropriado abaixo do <ServiceCallout>.

    Por exemplo, o tempo limite de E/S do código a seguir será de 120 segundos:

    <Timeout>120000</Timeout>
    

Como 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 na /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 definido 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 O roteador/host virtual foi configurado com um valor de tempo limite menor em comparação ao da Proxy de API/processador de mensagens.

Anote os valores definidos em todas as camadas, conforme mostrado na tabela abaixo:

Tempo limite no 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

Neste 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. Ou seja, ele usará o 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, um valor de 120 segundos é configurado em um proxy de API específico.

O valor de tempo limite mais alto é configurado somente no proxy de API, mas o roteador ainda configurado em 57 segundos. Assim, o roteador expira em 57 segundos, enquanto a mensagem O processador/back-end ainda está processando sua solicitação. Isso faz com que o roteador responda com 504 Gateway Timeout ao aplicativo cliente.

Resolução

Realize as etapas a seguir para configurar o tempo limite de E/S adequado no roteador e nas mensagens Processador para resolver esse problema.

  1. Consulte Práticas recomendadas para configurar o tempo limite de E/S e entender quais valores de tempo limite devem ser definidos em diferentes componentes envolvidos no fluxo de solicitação de API pelo Apigee Edge.
  2. No exemplo acima, se você verificar que é preciso definir um valor de tempo limite mais alto porque o servidor de back-end exige mais tempo, e você aumentou o tempo limite do processador de mensagens para 120 segundos, depois defina um valor de tempo limite maior para 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 Configurar o tempo limite de E/S nos roteadores para definir o tempo limite no host virtual.