502 Gateway inválido - TooBigLine

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X
.info

Sintoma

O aplicativo cliente recebe um código de status HTTP 502 Bad Gateway com o código de erro protocol.http.TooBigLine como resposta para chamadas de API.

Mensagem de erro

O aplicativo cliente recebe o seguinte código de resposta:

HTTP/1.1 502 Bad Gateway

Além disso, você pode observar a seguinte mensagem de erro:

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

Causas possíveis

Esse erro ocorre 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 (referida como 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 por 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 que é enviada representa a linha de resposta , conforme descrito acima. Ela é seguida pelos cabeçalhos e pelo corpo/payload da resposta.A captura de tela de exemplo a seguir mostra uma soliculaçã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 inicial (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 de ~15 bytes, já que contém 15 ASCII characters. Como isso está dentro do limite permitido no Apigee Edge, a resposta é enviada de volta ao cliente sem erros pelo Apigee Edge.

  2. Da mesma forma, se você analisar 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 (referida como linha de resposta aqui) e solicitações e respostas HTTP típicas, o tamanho seria muito menor que o limite padrão definido de 2 K no Apigee Edge. Portanto, talvez não atinjamos o limite. No entanto, confira 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 estar respondendo com uma resposta não HTTP resposta.
  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 Receber o erro protocol.http.TooBigLine, "response line size exceeding 2,048.

Confira 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 da nuvem pública e privada do Edge

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 da Apigee Edge como um usuário com um papel apropriado.
  2. Alterne para a organização em que você quer investigar o problema.

  3. Acesse a página Analisar > Monitoramento de APIs > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Você pode selecionar o filtro Proxy para restringir o código de falha.
  6. Trace o código de falha em relação ao tempo.
  7. Selecione uma célula que tenha o código de falha protocol.http.TooBigLine conforme mostrado abaixo:

    ( ampliar imagem)

  8. As informações sobre o código de falha protocol.http.TooBigLine serão mostradas conforme abaixo:

    ( ampliar imagem)

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

  10. Na janela Registros, anote 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 Trace

  1. Ative a sessão de trace e:
    1. Aguarde a ocorrência do erro 502 Bad Gateway. ou
    2. Se você puder 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 trace.
  3. Navegue pelas diferentes fases do trace e localize onde a falha ocorreu.
  4. Normalmente, você encontra o erro no flowinfo erro logo após a fase Solicitação enviada ao servidor de destino , conforme mostrado abaixo:

    Anote os valores do erro no trace:

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

    Isso indica que o Apigee Edge (componente do 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. A mensagem de erro enviada ao cliente será mostrada na fase Resposta enviada ao cliente , conforme mostrado abaixo:

    ( ampliar imagem)

  6. Anote os valores do erro no trace:
    • Erro:502 Bad Gateway.
    • Conteúdo do erro: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Você também pode navegar até a fase AX (dados de análise registrados) no trace e clicar nela para conferir os detalhes do erro.

    ( ampliar imagem)

    Anote 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 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 erros HTTP 502.
  2. Verifique os registros de acesso do NGINX:

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

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

  3. Pesquise para verificar se há erros 502 durante um período específico (se o problema ocorreu no passado) ou se ainda há solicitações com 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 exemplo 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 que o limite permitido

Diagnóstico

  1. Determine o código de falha e a origem da falha do erro observado usando o monitoramento de APIs , a ferramenta Trace ou os registros de acesso do NGINX, conforme explicado em Etapas comuns do diagnóstico.
  2. Se a origem da falha tiver o valor target, isso indica que o tamanho da linha de resposta enviada pelo aplicativo do servidor de destino/back-end para a Apigee é maior que o limite permitido no Apigee Edge.
  3. É possível validar que 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:

    Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte a 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:

    Se você tiver acesso à solicitação real feita para o aplicativo do servidor de destino/back-end, siga estas etapas:

    1. Verifique o tamanho da linha de resposta.
    2. Se você descobrir que o tamanho do URI é maior que o limite permitido no Apigee Edge, essa é 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 do cliente e tente descobrir o tamanho da linha de resposta que está sendo enviada para o Apigee Edge.

    Registros do processador de mensagens

    Para validar usando 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 ID 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 do diagnóstico.
    2. Pesquise o ID da mensagem no registro do processador de mensagens:

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

    3. Você vai encontrar linhas de system.log semelhantes a estas:

      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, 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]: corrija o aplicativo do servidor de destino/back-end para não enviar linhas de resposta de tamanho maior que o limite permitido

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

CwC

Opção 2: use 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 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 para o tamanho da linha de solicitação e resposta será documentado para Tamanho da linha de solicitação/resposta em Limites do Apigee Edge.
  2. Se você for um usuário da nuvem privada , poderá ter modificado o limite máximo padrão para o tamanho da linha de solicitação e resposta (embora 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 /opt/apigee/edge-message-processor/conf diretório e verifique qual valor foi definido, conforme mostrado abaixo:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. O resultado de 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 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 da API
  • Comando curl completo usado para reproduzir o erro 502
  • Arquivo de trace para as solicitações de API

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

  • Mensagem de erro completa observada para as solicitações com falha
  • Nome da organização
  • Nome do ambiente
  • Pacote de proxy de API
  • Arquivo de trace para as solicitações de API com falha
  • Comando curl completo usado para reproduzir o erro 502
  • Registros de acesso do NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Em que: 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