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:
- Linha de status (referida como linha de resposta na Apigee)
- ( Conjunto de cabeçalhos HTTP )
- [ 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
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ém15 ASCII characters. Como isso está dentro do limite permitido no Apigee Edge, a resposta é enviada de volta ao cliente sem erros pelo Apigee Edge.- Da mesma forma, se você analisar o
faultstringna 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:
- O servidor de destino/back-end não é um sistema HTTP. Ele pode estar respondendo com uma resposta não HTTP resposta.
- 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:
- Faça login na interface da Apigee Edge como um usuário com um papel apropriado.
Alterne para a organização em que você quer investigar o problema.
- Acesse a página Analisar > Monitoramento de APIs > Investigar.
- Selecione o período específico em que você observou os erros.
- Você pode selecionar o filtro Proxy para restringir o código de falha.
- Trace o código de falha em relação ao tempo.
Selecione uma célula que tenha o código de falha
protocol.http.TooBigLineconforme mostrado abaixo:
As informações sobre o código de falha
protocol.http.TooBigLineserão mostradas conforme abaixo:
Clique em Ver registros e expanda a linha da solicitação com falha.
- Na janela Registros, anote os seguintes detalhes:
- Código de status:
502 - Origem da falha:
target - Código de falha:
protocol.http.TooBigLine.
- Código de status:
- Se a origem da falha tiver o valor
targete o código de falha tiver o valorprotocol.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
- Ative a sessão de trace
e:
- Aguarde a ocorrência do erro
502 Bad Gateway. ou - Se você puder reproduzir o problema, faça a chamada de API e reproduza o erro
502 Bad Gateway.
- Aguarde a ocorrência do erro
- Selecione uma das solicitações com falha e examine o trace.
- Navegue pelas diferentes fases do trace e localize onde a falha ocorreu.
Normalmente, você encontra o erro no
flowinfoerro 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.
- error:
A mensagem de erro enviada ao cliente será mostrada na fase Resposta enviada ao cliente , conforme mostrado abaixo:
- 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"}}}
- Erro:
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.
Anote o valor do seguinte:
Cabeçalhos de solicitação Valor X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetConteú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:
- 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. Verifique os registros de acesso do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm que: ORG, ENV e PORT# são substituídos por valores reais.
- Pesquise para verificar se há erros
502durante um período específico (se o problema ocorreu no passado) ou se ainda há solicitações com falha com502. Se você encontrar erros
502com o X-Apigee-fault-code correspondente ao valor deprotocol.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.TooBigLineX-Apigee-fault-source target
Causa: o tamanho da linha de resposta é maior que o limite permitido
Diagnóstico
- 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.
- 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. É 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
faultstringacima 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:
- Verifique o tamanho da linha de resposta.
- 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.
- 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.
Pesquise o ID da mensagem no registro do processador de mensagens:
/opt/apigee/var/log/edge-message-processor/logs/system.logVocê vai encontrar linhas de
system.logsemelhantes 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,048na 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 status502com código de falhaprotocol.http.TooBiglinepara 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
- Analise o motivo de o cliente específico enviar uma linha de resposta de tamanho maior que o limite permitido, conforme definido em Limites.
- 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.
- 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.
- 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.
- 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.
- Na máquina do processador de mensagens, pesquise a propriedade
HTTPResponse.line.limitno/opt/apigee/edge-message-processor/confdiretório e verifique qual valor foi definido, conforme mostrado abaixo:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- O resultado de exemplo do comando acima é o seguinte:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
No exemplo de saída acima, observe que a propriedade
HTTPResponse.line.limitfoi definida com o valor2kemhttp.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
curlcompleto usado para reproduzir o erro502 Registros de acesso do NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logEm 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