502 Gateway inválido - TooBigLine

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 502 Bad Gateway com 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ê poderá encontrar a seguinte mensagem de erro:

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

Causas possíveis

Este erro ocorre se o tamanho da Response-Line enviado pelo servidor de destino/back-end para a Apigee O Edge, como parte da resposta HTTP, é maior que o máximo permitido máximo no Apigee Edge.

Antes de analisarmos as possíveis causas desse erro, vamos entender o que é o campo de linha de significa e como verificar o tamanho dele.

Como entender a linha de resposta

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

  1. Status-Line (chamado de Response-Line 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 valor numérico de status e a frase textual associada correspondente, conforme mostrado abaixo:

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

Quando uma resposta HTTP é enviada pelo aplicativo de servidor de destino/back-end, a primeira linha que é enviado representa a linha de resposta conforme descrito acima. Isso é seguido pelo cabeçalhos e corpo da resposta/payload.A captura de tela abaixo mostra um exemplo solicitação curl, as partes Solicitação e Resposta (junto com o linha de resposta).

Como entender o tamanho da linha de resposta

  1. No exemplo discutido acima, a linha start (primeira linha) na resposta também chamado de Linha de resposta é o seguinte:

    HTTP/1.1 200 OK
    

    Esta linha de resposta tem o tamanho ~15 bytes porque contém 15 ASCII characters. Como isso está dentro do 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 A mensagem de erro mostrada acima contém "response line size exceeding 2,048". Isso indica que a Response-Line na resposta HTTP enviado pelo servidor de destino/back-end excedeu 2.048 bytes.

Noções básicas sobre linhas de resposta grandes

De acordo com a definição de Status-Linha (chamada de Linha de resposta aqui) e solicitações HTTP típicas e o tamanho seria muito menor que o limite padrão de 2 K no Apigee Edge, então talvez não atingir 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 mensagem resposta.
  2. O servidor de destino/back-end tem problemas e envia uma longa linha de resposta como parte da solicitação resposta.

Leia mais sobre isso em Recebendo o error protocol.http.TooBigLine, "tamanho da linha de resposta excedendo 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 Response-Line enviada pelo servidor de destino/back-end como parte do A resposta HTTP para o Apigee Edge é maior que limite permitido no Apigee Edge 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

Para diagnosticar o erro usando a API Monitoring:

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

  3. Navegue até o menu Analisar > Monitoramento de APIs > Investigar.
  4. Selecione o período específico em que você observou os erros.
  5. Selecione o filtro Proxy para restringir o código de falha.
  6. Compare Código de falha com Time.
  7. Selecione uma célula que tenha o código de falha protocol.http.TooBigLine como mostrados abaixo:

    ( ver imagem maior)

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

    ( ver imagem maior)

  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 da falha:protocol.http.TooBigLine.
  11. Se a Origem da falha tiver o valor target e o valor Code tem o valor protocol.http.TooBigLine, então 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 for possível 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. Navegar pelas diferentes fases do trace e localizar a falha o incidente.
  4. O erro normalmente é encontrado no Erro flowinfo apenas após a fase Solicitação enviada ao servidor de destino, conforme mostrado abaixo:

    Observe os valores do erro no trace:

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

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

  5. Você verá a mensagem de erro enviada ao cliente no campo Response Sent to cliente, conforme mostrado abaixo:

    ( ver imagem maior)

  6. Observe 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 para a fase AX (Analytics Data Recorded) no trace e clicar nele para conferir os detalhes do erro.

    ( ver imagem maior)

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

    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 tiver acontecido no passado) ou se houver alguma solicitação que ainda esteja falhando com 502:
  4. Se você encontrar erros 502 no X-Apigee-fault-code correspondente ao valor de protocol.http.TooBigLine, em seguida, determine o valor de X-Apigee-fault-source.

    O exemplo de entrada do registro de acesso do NGINX acima 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 da falha e a fonte da falha do erro observado usando a API registros de acesso do Monitoring, da ferramenta Trace ou do NGINX, conforme explicado em Etapas comuns de diagnóstico.
  2. Se a Origem da falha tiver o valor target, isso indica que o O tamanho da linha de resposta enviado pelo aplicativo de servidor de destino/back-end à Apigee é maior que o limite permitido no Apigee Edge.
  3. Você pode confirmar que o tamanho da linha de resposta excedeu o limite permitido de 2 KB usando uma 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 o 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 permitido máximo de 2 KB.

    Solicitação real

    Para validar usando a solicitação real:

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

    1. Verifique o tamanho da linha de resposta
    2. Se você achar que o tamanho do URI é maior do que limite permitido no Apigee Edge, essa será a causa dos o 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 mil caracteres ASCII.

      Se você estiver usando outro cliente, revise os registros dele e tente para descobrir o tamanho da linha de resposta enviada ao 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. Determinar o ID da mensagem da solicitação com falha usando a API Monitoring, a ferramenta Trace ou do NGINX, conforme explicado nas Etapas comuns de 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 à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 no exemplo acima indica que o tamanho da linha de resposta é superior a 2 KB. Portanto, A Apigee Edge gera a exceção e retorna um código de status 502 com código de falha protocol.http.TooBigline aos 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 com tamanho maior que o limite permitido

  1. Analisar o motivo pelo qual o cliente específico enviou uma linha de resposta de tamanho maior do 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 envia uma linha de resposta com tamanho inferior ao limite permitido.
  3. Se for desejável e você quiser enviar uma linha de resposta de tamanho maior que limite permitido, vá para as próximas opções.

CwC

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

A Apigee fornece um CwC que permite aumentar o limite de tamanho da linha de resposta. Para mais detalhes, consulte Definir o limite de 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 solicitações e O tamanho da linha de resposta está conforme documentado em Tamanho da linha de solicitação/resposta em Limites do Apigee Edge.
  2. Se você for um usuário da nuvem privada , talvez tenha modificado o valor máximo padrão limite para o tamanho da solicitação e da linha de resposta (mesmo que não seja uma prática recomendada). Você pode determinar o limite máximo de tamanho de linha de resposta seguindo as instruções em Como verificar o limite atual

Como verificar o limite atual?

Nesta seção, explicamos 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 verificar veja qual valor foi definido conforme mostrado abaixo:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. O resultado de amostra 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 definido com o valor 2k no http.properties.

    Isso indica que o limite do tamanho da linha de resposta configurado na Apigee para Private Google Cloud tem 2 KB.

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

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

Colete as informações de diagnóstico a seguir 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 rastreamento para as solicitações de API

Se você for um usuário da nuvem privada, forneça estas 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 rastreamento das 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

    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