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.DuplicateHeader
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 uma mensagem de erro semelhante à mostrada abaixo:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
Causas possíveis
Esse erro vai ocorrer se um cabeçalho HTTP específico que não tem permissão para ter cópias no Apigee Edge aparecer mais de uma vez com valores iguais ou diferentes, como parte da resposta HTTP enviada pelo servidor de back-end para o Apigee Edge.
De acordo com a
RFC 7230, seção 3.2.2: ordem dos campos, um remetente NÃO pode gerar vários campos de cabeçalho com o mesmo nome de campo em uma mensagem, a menos que o valor inteiro desse campo seja definido como uma lista separada por vírgulas [por exemplo, #(values)] ou o campo de cabeçalho é uma exceção bem conhecida. Se o Apigee Edge descobrir que um mesmo cabeçalho específico, que não pode ter duplicatas, é enviado mais de uma vez na resposta HTTP enviada pelo servidor de destino/back-end,
ele responde com 502 Bad Gateway
e código de erro
protocol.http.DuplicateHeader
Estas são as possíveis causas desse erro:
Causa | Descrição | Instruções de solução de problemas aplicáveis para |
---|---|---|
Cabeçalho duplicado na resposta | A resposta do servidor de back-end contém cabeçalhos duplicados. | 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:
- Faça login na interface do Apigee Edge como usuário com um papel apropriado.
Alterne para a organização em que você quer investigar o problema.
- Navegue até a página Analisar > Monitoramento de API > Investigar.
- Selecione o período específico em que você observou os erros.
- Verifique se o filtro Proxy está definido como Todos.
- Trace o Código de falha em relação a Time.
Selecione uma célula com o código de falha
protocol.http.DuplicateHeader
, conforme mostrado abaixo:As informações sobre o código de falha
protocol.http.DuplicateHeader
são mostradas abaixo:- Verifique se o Código de status é
502
, conforme mostrado no exemplo acima. - Clique em Ver registros e expanda a linha da solicitação com falha.
Na janela "Registros", observe os seguintes detalhes:
- Código de status:
502
- Origem da falha:
target
- Código de falha:
protocol.http.DuplicateHeader
.
- Código de status:
- A origem da falha é
target
, o que indica que a resposta do servidor de back-end continha cabeçalhos duplicados.
Ferramenta de rastreamento
Para diagnosticar o erro usando a ferramenta Trace:
- Ative a sessão de rastreamento e:
- Aguarde a ocorrência do erro
502 Bad Gateway
ou - Se você conseguir reproduzir o problema, faça a chamada de API e reproduza o erro
502 Bad Gateway
.
- Aguarde a ocorrência do erro
Verifique se a opção Mostrar todas as informações do fluxo está ativada:
- Selecione uma das solicitações com falha e examine o rastro.
- Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
Você vai encontrar o erro normalmente em um fluxo após a fase Solicitação enviada para o servidor de destino, conforme mostrado abaixo:
Observe o valor do erro do trace.
O trace de amostra acima mostra o erro como
Duplicate Header "Expires"
. Como o erro é gerado pela Apigee após o envio da solicitação ao servidor de back-end, ele indica que o servidor de back-end enviou o cabeçalhoExpires
mais de uma vez.- Navegue até a fase AX (Dados do Analytics registrados) no rastreamento e clique nela.
Role para baixo até a seção Phase Details - Response Headers e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:
- Você verá os valores de X-Apigee-fault-code e X-Apigee-fault-source
como
protocol.http.DuplicateHeader
etarget
, indicando que esse erro foi causado porque cabeçalhos duplicados foram transmitidos pelo servidor de back-end para o cabeçalho de respostaExpires
.Cabeçalhos de resposta Valor X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Verifique se você está usando o encadeamento de proxy, ou seja, se o servidor ou endpoint de destino está invocando outro proxy na Apigee.
Para determinar isso, volte para a fase do servidor Solicitação enviada para o destino. Clique em Mostrar curl.
A janela Curl for Request Sent to Target Server será aberta. Nela, é possível determinar o alias do host do servidor de destino.
- Se o alias de host do servidor de destino estiver apontando para um alias de host virtual, ele será encadeamento de proxy. Nesse caso, é necessário repetir todas as etapas acima para o proxy encadeado até
determinar o que está realmente causando o erro
502 Bad Gateway
. - Se o alias de host do servidor de destino apontar para seu servidor de back-end, isso indica que o servidor de back-end está enviando os cabeçalhos duplicados na resposta para a Apigee.
NGINX
Para diagnosticar o erro usando os 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 os erros HTTP
502
. 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.
- 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 com502
. Se você encontrar erros
502
com o X-Apigee-fault-code correspondente ao valor deprotocol.http.DuplicateHeader
, determine o valor de X-Apigee-fault-source.Exemplo de erro 502 do registro de acesso do NGINX:
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.DuplicateHeader
X-Apigee-fault-source target
Causa: cabeçalho duplicado na resposta
Diagnóstico
- Determine o código de falha e a Origem da falha do erro observado com os registros de acesso do Monitoring da API ou do NGINX, conforme explicado em Etapas comuns de diagnóstico.
- Se a Origem de falha tiver o valor
target
, isso indica que a resposta enviada pelo servidor de destino contém cabeçalhos duplicados. É possível determinar o cabeçalho real enviado mais de uma vez como parte da resposta usando um dos métodos a seguir:
Mensagem de erro
Como usar a mensagem de erro:
Se você tiver acesso à mensagem de erro completa recebida do Apigee Edge, consulte
faultstring
. Ofaultstring
contém o nome do cabeçalho que foi enviado mais de uma vez.Exemplo de mensagem de erro:
"faultstring":"Duplicate Header \"Expires\""
- Na mensagem de erro acima, é possível ver que o cabeçalho
Expires
é enviado mais de uma vez, conforme visto nofaultstring
.
Solicitação real
Usando a solicitação real:
- Se você não tiver acesso à solicitação real feita ao servidor de destino, receba
o comando
curl
correspondente em Como usar a ferramenta Trace nas etapas 10.a e 10.b. Se você tiver acesso à solicitação real feita ao aplicativo do servidor de destino, siga estas etapas:
Faça uma chamada para o servidor de destino.
Exemplo de solicitação para o servidor de destino usado neste exemplo:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
Verifique a lista de cabeçalhos vistos na resposta.
Exemplo de resposta do servidor de destino usado neste exemplo:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
Na solicitação de exemplo acima, o cabeçalho
Expires
é enviado mais de uma vez. Portanto, essa solicitação falha com o erro502 Bad Gateway
e o código do erro:protocol.http.DuplicateHeader
.Se o cabeçalho com o nome que aparece no
faultstring
aparecer mais de uma vez na resposta do servidor de back-end, essa será a causa do erro. No caso acima, o cabeçalhoExpires
é enviado mais de uma vez.
Resolução
Corrigir duplicação
Opção 1 [Opção recomendada] Corrigir o servidor de back-end para não incluir cabeçalhos duplicados
- Analise o motivo para o servidor de back-end específico enviar o cabeçalho
Expires
duplicado e verifique se os proxies da API podem aceitar isso. Na maioria dos casos, isso não é desejável de acordo com a especificação HTTP RFC7230 (link em inglês). - Se não for desejável, modifique o aplicativo do servidor de destino para não enviar cabeçalhos duplicados.
No exemplo discutido acima, percebe-se que o cabeçalho
Expires
é enviado duas vezes com o mesmo valor, o que não é desejável. Para corrigir o problema, verifique se o servidor de destino transmite o cabeçalhoExpires
apenas uma vez. - Se for desejável e você quiser permitir os cabeçalhos duplicados, acesse Opção 2 usando a propriedade CwC.
CwC
Opção 2: como usar a propriedade CwC
A Apigee fornece uma propriedade
HTTPHeader.<HeaderName>
da CwC ,que permite que aplicativos clientes e servidores
de destino enviem cabeçalhos duplicados para proxies de API na Apigee Edge.
Propriedade da CwC | Valores |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
Por exemplo, a propriedade a seguir pode ser definida nos processadores de mensagens para permitir cópias
e múltiplos valores para o cabeçalho Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- Se você for um usuário da nuvem privada, poderá configurar a propriedade para evitar que o Apigee
Edge gere um erro
502 Bad Gateway
, mesmo que a solicitação contenha cabeçalhos duplicados, usando o guia de instruções Como configurar processadores de mensagens para usar cabeçalhos duplicados. - Se você for um usuário da nuvem pública, entre em contato com o suporte do Apigee Edge para configurar essa propriedade para sua organização.
Especificação
A Apigee responde com a resposta de erro 502 Bad Gateway
porque espera que o
servidor de back-end se comporte de acordo com as seguintes especificações de RFC:
Especificação |
---|
RFC 7230, seção 3.2.2: ordem dos campos |
RFC 7230, seção 3.2: campos de cabeçalho |
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
Reúna 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 de API
- Completar o comando
curl
usado para reproduzir o erro502
- 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 do ambiente
- Pacote de proxy de API
- Arquivo de rastreamento das solicitações de API
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