502 Gateway inválido - ResponseWithBody

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 o código de erro protocol.http.ResponseWithBody como uma 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, uma das seguintes mensagens de erro pode aparecer:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

Causas possíveis

Esse erro vai ocorrer se a resposta HTTP do servidor de back-end para o Apigee Edge for 204 No Content ou 205 Reset Content, mas contiver o corpo da resposta e/ou um ou mais dos cabeçalhos a seguir:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

De acordo com as especificações RFC 7231, seção 6.3.5: 204 sem conteúdo e RFC 7231, seção 6.3.6: Redefinir conteúdo 205, espera-se que nenhum outro conteúdo deva ser enviado como parte do corpo do payload de resposta com o código de status 204 No Content ou 205 Reset Content pelo servidor de origem. Os cabeçalhos de resposta, como Content-Length, Content-Encoding ou Transfer-Encoding, indicam o tamanho, o tipo ou o formato do payload de resposta.

Portanto, o Apigee Edge retorna um código de status 502 Bad Gateway com o código de erro protocol.http.ResponseWithBody para o cliente nas seguintes circunstâncias:

Código de status do servidor de back-end
A resposta do servidor de back-end contém 204 No Content 205 Redefinir conteúdo
Corpo da resposta ERROR ERROR

Cabeçalho Content-Length

(definido como zero)

ERROR ERROR

Content-Encoding

(definido como codificação compatível no Apigee Edge)

ERROR SEM ERRO
Transfer-Encoding ERROR ERROR

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

Causa Descrição Instruções de solução de problemas aplicáveis para
Corpo de resposta ou cabeçalhos com resposta 204 do servidor de back-end O servidor de back-end envia uma resposta 204 No Content ou 205 Reset Content com um corpo de resposta e/ou um ou mais dos cabeçalhos Content-Type, Content-Encoding ou Transfer-Encoding. 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. Trace o Código de falha em relação a Time.
  6. Selecione uma célula com o código de falha protocol.http.ResponseWithBody, conforme mostrado abaixo:

    ( ver imagem ampliada)

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

    ( ver imagem ampliada)

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

    ( ver imagem ampliada)

  9. Na janela Registros, observe os seguintes detalhes:
    • Código de status: 502
    • Origem da falha: target
    • Código de falha: protocol.http.ResponseWithBody.
  10. Se a Origem da falha tiver o valor target e o Código de falha tiver o valor protocol.http.ResponseWithBody, isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status 204 No Content ou 205 Reset Content com o corpo da resposta e/ou um dos cabeçalhos mencionados na seção Possíveis causas.

Ferramenta de rastreamento

Para diagnosticar o erro usando a ferramenta Trace:

  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. Verifique se a opção Mostrar todos os FlowInfos está ativada:

  3. Selecione uma das solicitações com falha e examine o rastro.
  4. Navegue pelas diferentes fases do rastro e localize onde a falha ocorreu.
  5. Normalmente, você encontra o erro no Erro flowinfo logo após a fase Solicitação enviada para o servidor de destino, conforme mostrado abaixo:

    Cenário 1

    Cenário 1: o servidor de back-end responde com o código de status 204 No Content contendo o corpo da resposta e/ou um dos cabeçalhos listados em Possíveis causas.

    Observe os valores a seguir no rastro:

    • erro: Received 204 Response with message body
    • error.class::com.apigee.rest.framework.BadGateway

    Cenário 2

    Cenário 2: o servidor de back-end responde com o código de status 204 No Content contendo o corpo da resposta e/ou um dos cabeçalhos listados em Possíveis causas.

    Observe os valores a seguir no rastro:

    • erro: Received 205 Response with message body
    • error.class::com.apigee.rest.framework.BadGateway
  6. Navegue até a fase AX (Dados do Analytics registrados) no rastro e clique nela.
  7. Role para baixo até a seção Phase Details, Error Headers e determine os valores de X-Apigee-fault-code e X-Apigee-fault-source, conforme mostrado abaixo:

    ( ver imagem ampliada)

  8. Observe que os valores de X-Apigee-fault-code e X-Apigee-fault-source are protocol.http.ResponseWithBody e target, respectivamente. Isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status 204 No Content ou 205 Reset Content com o corpo da resposta e/ou um dos cabeçalhos mencionados em Possíveis causas.
    Erro Valor
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

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 o HTTP 502 Bad Gateway.
  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á algum erro 502 com o código protocol.http.ResponseWithBody durante um período específico (se o problema tiver acontecido anteriormente) ou se ainda há alguma solicitação com falha com 502.
  4. Se você encontrar erros 502 com o X-Apigee-fault-code correspondente ao valor de protocol.http.ResponseWithBody, 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.ResponseWithBody
    X-Apigee-fault-source target
  5. Os valores de X-Apigee-fault-code e X-Apigee-fault-source são protocol.http.ResponseWithBody e target, respectivamente. Isso indica que o erro ocorreu porque o servidor de back-end enviou um código de status 204 No Content ou 205 Reset Content com o corpo da resposta e/ou um dos cabeçalhos mencionados em Possíveis causas.

Causa: corpo da resposta ou cabeçalhos com resposta 204 do servidor de back-end

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 o Código de falha for protocol.http.ResponseWithBody e a Origem da falha tiver o valor target, isso indica que o servidor de back-end respondeu com um código de status 204 No Content ou 205 Reset Content com o corpo da resposta e/ou um dos cabeçalhos mencionados em Possíveis causas.
  3. Para validar se o servidor de back-end realmente enviou um corpo de payload de resposta e/ou um ou mais dos cabeçalhos mencionados em Possíveis causas, execute as seguintes etapas:

    1. Se você for um usuário da nuvem pública e puder fazer a mesma solicitação de API ao servidor de back-end diretamente de qualquer um dos seus sistemas.

    2. Se você for um usuário da nuvem privada, poderá fazer a mesma solicitação de API ao servidor de back-end diretamente de um dos processadores de mensagens associados à organização e ao ambiente específicos em que a falha foi observada.
    3. Revise a resposta recebida do servidor de back-end e verifique se ela contém um corpo de payload de resposta e/ou um ou mais dos cabeçalhos mencionados acima. Se estiver, esse é a causa do erro.

      Amostra 1

      Exemplo 1: resposta do servidor de back-end 204 com cabeçalho Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Nesta amostra, o servidor de back-end respondeu com o código de status 204 No Content e Content-Encoding: gzip

      Amostra 2

      Exemplo 2: resposta 204 do servidor de back-end com cabeçalho Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      Nesta amostra, o servidor de back-end respondeu com o código de status 204 No Content e Content-Length: 48

      Amostra 3

      Exemplo 3: resposta 205 do servidor de back-end com corpo de resposta

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      Nesta amostra, o servidor de back-end respondeu com o código de status 205 Reset Content com o corpo da resposta This is a sample Response.

    4. Em todos os exemplos acima, o servidor de back-end enviou o código de status 204 No Content ou 205 Reset Content com o corpo da resposta e/ou um dos cabeçalhos mencionados em Possíveis causas.
    5. Portanto, o Apigee Edge enviou um código de status 502 Bad Gateway com código de erro protocol.http.ResponseWithBody.

Resolução

Verifique se o servidor de back-end sempre atende à especificação RFC 7231, seção 6.3.6: 205 Redefinir conteúdo ao enviar a resposta 204 No Content ou 205 Reset Content para o Apigee Edge. Ou seja, o servidor de back-end NÃO PODE enviar o seguinte como parte de uma resposta 204 No Content ou 205 Reset Content:

  1. Corpo do payload de resposta
  2. E qualquer um destes cabeçalhos:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Especificação

O Apigee Edge responderá com o código de status 502 Bad Gateway e o código de erro protocol.http.ResponseWithBody se o servidor de back-end enviar uma resposta 204 No Content ou 205 Reset Content, mas não aderir às especificações de RFC a seguir:

Especificação
RFC 7231, seção 6.3.5: 204 sem conteúdo
RFC 7231, seção 6.3.6: 205 Redefinir conteúdo

Pontos principais

A solução recomendada é corrigir o servidor de back-end para enviar o código de status 204 No Content e 205 Reset Content sem corpo de resposta e qualquer um dos cabeçalhos - Content-Length, Content-Encoding e Transfer-Encoding e aderir às especificações RFC 7231, seção 6.3.5: 204 sem conteúdo e RFC 7231, seção 6.3.6: 205 Redefinir conteúdo.

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
  • Completar o comando curl 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 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