502 Gateway inválido - TooBigLine

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 502 Bad Gateway com código de erro protocol.http.TooBigLine como resposta para chamadas de API.

Mensagem de erro

O aplicativo cliente recebe este código de resposta:

HTTP/1.1 502 Bad Gateway

Além disso, talvez você veja a seguinte mensagem de erro:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Causas possíveis

Esse erro vai ocorrer se o tamanho da Linha de resposta enviada pelo servidor de destino/back-end para o Apigee Edge como parte da resposta HTTP for maior que o limite máximo permitido no Apigee Edge.

Antes de analisar as possíveis causas desse erro, vamos entender o que significa a linha de resposta e como verificar o tamanho dela.

Noções básicas sobre a linha de resposta

Uma resposta HTTP típica consiste em três partes:

  1. Linha de status (chamada de Linha de resposta na Apigee)
  2. ( Conjunto de cabeçalhos HTTP)
  3. [ Corpo ]

A linha de resposta consiste em três partes: versão do protocolo seguida de um código de status numérico e a frase textual associada, conforme mostrado abaixo:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Quando uma resposta HTTP é enviada pelo aplicativo do servidor de destino/back-end, a primeira linha enviada representa a Linha de resposta, conforme descrito acima. Isso é seguido pelos cabeçalhos e corpo/payload da resposta.A captura de tela de amostra a seguir mostra uma solicitação curl típica, a parte Solicitação e a parte Resposta (junto com a linha de resposta).

Noções básicas sobre o tamanho da linha de resposta

  1. No exemplo discutido acima, a linha início (primeira linha) na resposta, também chamada de linha de resposta, é a seguinte:

    HTTP/1.1 200 OK
    

    Essa linha de resposta tem um tamanho igual a ~15 bytes porque contém 15 ASCII characters. Como isso está dentro do limite permitido no Apigee Edge, a resposta é enviada de volta ao cliente sem nenhum erro pelo Apigee Edge.

  2. Da mesma forma, se você observar o faultstring na mensagem de erro mostrada acima, ele contém "response line size exceeding 2,048". Isso indica que a linha de resposta na resposta HTTP enviada pelo servidor de destino/back-end excedeu 2.048 bytes.

Noções básicas sobre a linha de resposta grande

De acordo com a definição de linha de status (chamada de linha de resposta aqui) e as solicitações e respostas HTTP típicas, o tamanho seria muito menor do que o limite padrão definido de 2 k no Apigee Edge. Por isso, talvez não atinjamos o limite. No entanto, veja alguns cenários possíveis em que você pode exceder esse limite:

  1. O servidor de destino/back-end não é um sistema HTTP. Ele pode ser uma resposta que não seja HTTP.
  2. O servidor de destino/back-end tem problemas e envia uma linha de resposta longa como parte da resposta HTTP.

Leia mais sobre isso em Como receber o error protocol.http.TooBigLine, "tamanho da linha de resposta superior a 2.048.

Estas são as possíveis causas do erro:

Causa Descrição Instruções de solução de problemas aplicáveis para
O tamanho da linha de resposta é maior que o limite permitido O tamanho da Linha de resposta enviada pelo servidor de destino/back-end como parte da resposta HTTP para o Apigee Edge é maior que o limite permitido no Apigee Edge 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

Para diagnosticar o erro usando o monitoramento de APIs:

  1. Faça login na interface do Apigee Edge como usuário com um papel apropriado.
  2. Alterne para a organização em que você quer investigar o problema.

  3. Navegue até a página Analisar > Monitoramento de API > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Selecione o filtro Proxy para restringir o código da falha.
  6. Trace o Código de falha em relação a Time.
  7. Selecione uma célula com o código de falha protocol.http.TooBigLine, conforme mostrado abaixo:

    ( ver imagem ampliada)

  8. Você verá as informações sobre o código de falha protocol.http.TooBigLine, conforme mostrado abaixo:

    ( ver imagem ampliada)

  9. Clique em Ver registros e expanda a linha da solicitação com falha.

  10. Na janela Registros, observe os seguintes detalhes:
    • Código de status: 502
    • Origem da falha: target
    • Código de falha: protocol.http.TooBigLine.
  11. Se a Origem da falha tiver o valor target e o Código de falha tiver o valor protocol.http.TooBigLine, isso indica que a resposta HTTP do servidor de destino/ back-end tem um tamanho de linha de resposta maior que o limite máximo permitido no Apigee Edge.

Ferramenta de rastreamento

  1. Ative a sessão de rastreamento e:
    1. Aguarde a ocorrência do erro 502 Bad Gateway.
    2. Se você conseguir reproduzir o problema, faça a chamada de API e reproduza o erro 502 Bad Gateway.
  2. Selecione uma das solicitações com falha e examine o rastro.
  3. Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
  4. Normalmente, você encontra o erro no Erro flowinfo logo após a fase Solicitação enviada para o servidor de destino, conforme mostrado abaixo:

    Observe os valores do erro do trace:

    • erro: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Isso indica que o Apigee Edge (componente de processador de mensagens) gera o erro assim que recebe a resposta do servidor de back-end devido a um tamanho de linha de resposta que excede o limite permitido.

  5. Você veria a mensagem de erro enviada ao cliente na fase Resposta enviada ao cliente, conforme mostrado abaixo:

    ( ver imagem ampliada)

  6. Observe os valores do erro do rastro:
    • Erro: 502 Bad Gateway.
    • Conteúdo do erro: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Também é possível navegar para a fase AX (Dados do Analytics gravados) no rastreamento e clicar nela para ver os detalhes do erro.

    ( ver imagem ampliada)

    Observe o valor do seguinte:

    Cabeçalhos de solicitação Valor
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Conteúdo do erro : corpo {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

  1. Se você for um usuário da nuvem privada, poderá usar os registros de acesso do NGINX para determinar as principais informações sobre os erros HTTP 502.
  2. Verifique os registros de acesso do NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Onde:ORG, ENV e PORT# são substituídos por valores reais.

  3. Pesquise se há erros 502 durante um período específico (se o problema aconteceu anteriormente) ou se há alguma solicitação que ainda falha com 502.
  4. Se você encontrar erros 502 com o X-Apigee-fault-code correspondente ao valor de protocol.http.TooBigLine, determine o valor de X-Apigee-fault-source.

    A entrada de amostra acima do registro de acesso do NGINX tem os seguintes valores para X- Apigee-fault-code e X-Apigee-fault-source:

    Cabeçalhos de resposta Valor
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

Causa: o tamanho da linha de resposta é maior do que o limite permitido

Diagnóstico

  1. Determine o código de falha e a origem da falha do erro observado usando o monitoramento da API, a ferramenta de rastreamento ou os registros de acesso do NGINX, conforme explicado nas etapas comuns de diagnóstico.
  2. Se a Origem de falha tiver o valor target, isso indica que o tamanho da linha de resposta enviado pelo aplicativo do servidor de destino/back-end para a Apigee é maior que o limite permitido no Apigee Edge.
  3. Confirme se o tamanho da linha de resposta excedeu o limite permitido de 2 KB usando um dos seguintes métodos:

    Mensagem de erro

    Para validar usando a mensagem de erro, siga estas etapas:

    Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte faultstring.

    Exemplo de mensagem de erro:

    "faultstring":"response line size exceeding 2,048"
    

    O faultstring acima indica que o tamanho da linha de resposta excedeu o limite permitido de 2 KB.

    Solicitação real

    Para validar usando a solicitação real, faça o seguinte:

    Se você tiver acesso à solicitação real feita ao aplicativo do servidor de destino/back-end, execute as seguintes etapas:

    1. Verificar o tamanho da linha de resposta
    2. Se você achar que o tamanho do URI é maior que o limite permitido no Apigee Edge, essa será a causa do problema.

      Exemplo de resposta do servidor de destino/back-end:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      No caso acima, a linha de resposta HTTP/1.1 200 1111…<trimmed>...11111111 é maior que 2 KB, ou seja, contém mais de 2 K caracteres ASCII.

      Se você estiver usando outro cliente, revise os registros dele e tente descobrir o tamanho da linha de resposta enviada ao Apigee Edge.

    Registros do processador de mensagens

    Para validar usando os registros do processador de mensagens:

    Se você for um usuário da nuvem privada, poderá usar os registros do processador de mensagens para validar se o tamanho da linha de resposta excedeu o limite permitido no Apigee Edge.

    1. Determine o código da mensagem da solicitação com falha usando o monitoramento de APIs, a ferramenta Trace ou os registros de acesso do NGINX, conforme explicado em Etapas comuns de diagnóstico.
    2. Procure o ID da mensagem no log do Processador de mensagens:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Você vai encontrar linhas de system.log semelhantes às seguintes:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      O texto message = response line size exceeding 2,048 na mensagem de erro acima indica que o tamanho da linha de resposta é maior que 2 KB. Portanto, o Apigee Edge gera a exceção e retorna um código de status 502 com código de falha protocol.http.TooBigline para aplicativos clientes.

Resolução

Corrigir tamanho

Opção 1 [recomendada]: corrigir o aplicativo de servidor de destino/back-end para não enviar linhas de resposta maiores que o limite permitido

  1. Analise o motivo para o cliente específico enviar uma linha de resposta com tamanho maior que o limite permitido, conforme definido em Limites.
  2. Se não for desejável, modifique seu aplicativo de servidor de destino/back-end para que ele envie uma linha de resposta menor que o limite permitido.
  3. Se for desejável e você quiser enviar uma linha de resposta com tamanho maior que o limite permitido, siga as próximas opções.

CwC

Opção 2: usar a propriedade CwC para aumentar o limite da linha de resposta

A Apigee fornece uma propriedade CwC que permite aumentar o limite de tamanho da linha de resposta. Para mais detalhes, consulte Definir o limite da linha de resposta no processador de mensagens.

Limites

A Apigee espera que o aplicativo cliente e o servidor de back-end não enviem linhas de solicitação/resposta com tamanhos maiores que o limite permitido, conforme documentado para o Limite de linha de solicitação/resposta em Limites do Apigee Edge.

  1. Se você for um usuário da nuvem pública, o limite máximo de tamanho de solicitação e linha de resposta será conforme documentado em Tamanho da solicitação/linha de resposta em Limites do Apigee Edge.
  2. Se você for um usuário da nuvem privada , talvez tenha modificado o limite máximo padrão para o tamanho da solicitação e da linha de resposta, mesmo que isso não seja uma prática recomendada. É possível determinar o limite máximo de tamanho da linha de resposta seguindo as instruções em Como verificar o limite atual.

Como verificar o limite atual?

Esta seção explica como verificar se a propriedade HTTPResponse.line.limit foi atualizada com um novo valor nos processadores de mensagens.

  1. Na máquina do processador de mensagens, pesquise a propriedade HTTPResponse.line.limit no diretório /opt/apigee/edge-message-processor/conf e verifique qual valor foi definido conforme mostrado abaixo:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. O resultado do exemplo do comando acima é o seguinte:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. No exemplo de saída acima, observe que a propriedade HTTPResponse.line.limit foi definida com o valor 2k em http.properties.

    Isso indica que o limite para o tamanho da linha de resposta configurado na Apigee para nuvem privada é de 2 KB.

Se você ainda precisar de ajuda do suporte da Apigee, acesse Precisamos coletar informações de diagnóstico.

É necessário coletar informações de diagnóstico

Reúna as seguintes informações de diagnóstico e entre em contato com o suporte do Apigee Edge:

Se você for um usuário da nuvem pública, forneça as seguintes informações:

  • Nome da organização
  • Nome do ambiente
  • Nome do proxy de API
  • Comando curl completo usado para reproduzir o erro 502
  • Arquivo de rastreamento das solicitações de API

Se você for um usuário da nuvem privada, forneça as seguintes informações:

  • Concluir a mensagem de erro observada para as solicitações com falha
  • Nome da organização
  • Nome do ambiente
  • Pacote de proxy de API
  • Arquivo de rastreamento das solicitações de API com falha
  • Completar o comando curl usado para reproduzir o erro 502
  • Registros de acesso do NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Onde:ORG, ENV e PORT# são substituídos por valores reais.

  • Registros do sistema do processador de mensagens /opt/apigee/var/log/edge-message-processor/logs/system.log