502 Bad Gateway - ResponseWithBody

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Sintomo

L'applicazione client riceve un codice di stato HTTP 502 Bad Gateway con il codice di errore protocol.http.ResponseWithBody come risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 502 Bad Gateway

Inoltre, potresti visualizzare uno dei seguenti messaggi di errore:

{
   "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"
      }
   }
}

Possibili cause

Questo errore si verifica se la risposta HTTP del server di backend ad Apigee Edge è 204 No Content o 205 Reset Content ma contiene il corpo della risposta e/o una o più delle seguenti intestazioni:

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

In base alle specifiche RFC 7231, sezione 6.3.5: 204 No Content e RFC 7231, sezione 6.3.6: 205 Reset Content, è previsto che il server di origine non invii contenuti aggiuntivi come parte del corpo del payload della risposta con codice di stato 204 No Content o 205 Reset Content. Le intestazioni della risposta come Content-Length, Content-Encoding o Transfer-Encoding indicano le dimensioni, il tipo o il formato del payload della risposta.

Pertanto, Apigee Edge restituisce un codice di stato 502 Bad Gateway con il codice di errore protocol.http.ResponseWithBody al client nelle seguenti circostanze:

Codice di stato del server di backend
La risposta del server di backend contiene 204 Nessun contenuto 205 Reimposta contenuto
Corpo della risposta ERRORE ERRORE

Intestazione Content-Length

(impostata su un valore diverso da zero)

ERRORE ERRORE

Content-Encoding

(impostata su codifica supportata in Apigee Edge)

ERRORE NESSUN ERRORE
Transfer-Encoding ERRORE ERRORE

Ecco le possibili cause di questo errore:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Corpo della risposta o intestazioni con risposta 204 dal server di backend Il server di backend invia una 204 No Content o 205 Reset Content risposta con un corpo della risposta e/o una o più delle intestazioni Content-Type, Content-Encoding o Transfer-Encoding. Utenti di Edge Public e Private Cloud

Passaggi comuni per la diagnosi

Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:

Monitoraggio delle API

Per diagnosticare l'errore utilizzando il monitoraggio delle API:

  1. Accedi all'interfaccia utente di Apigee Edge come utente con un ruolo appropriato.
  2. Passa all'organizzazione in cui vuoi esaminare il problema.

  3. Vai alla pagina Analizza > Monitoraggio API > Esamina.
  4. Seleziona l'intervallo di tempo specifico in cui hai osservato gli errori.
  5. Traccia Codice di errore rispetto a Ora.
  6. Seleziona una cella con il codice di errore protocol.http.ResponseWithBody come mostrato di seguito:

    ( visualizza immagine più grande)

  7. Verranno visualizzate le informazioni sul codice di errore protocol.http.ResponseWithBody come mostrato di seguito:

    ( visualizza immagine più grande)

  8. Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.

    ( visualizza immagine più grande)

  9. Nella finestra Log, prendi nota dei seguenti dettagli:
    • Codice di stato: 502
    • Origine errore: target
    • Codice di errore: protocol.http.ResponseWithBody.
  10. Se Origine errore ha il valore target e Codice di errore ha il valore protocol.http.ResponseWithBody, significa che l'errore si è verificato perché il server di backend ha inviato un codice di stato 204 No Content o 205 Reset Content con il corpo della risposta e/o una delle intestazioni menzionate nella sezione Possibili cause.

Strumento Traccia

Per diagnosticare l'errore utilizzando lo strumento Traccia:

  1. Attiva la sessione di traccia e:
    1. Attendi che si verifichi l'errore 502 Bad Gateway. o
    2. Se riesci a riprodurre il problema, effettua la chiamata API e riproduci l'errore 502 Bad Gateway.
  2. Assicurati che l'opzione Mostra tutte le informazioni sul flusso sia attivata:

  3. Seleziona una delle richieste non riuscite ed esamina la traccia.
  4. Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
  5. In genere, l'errore si trova in flowinfo Errore subito dopo la fase Richiesta inviata al server di destinazione , come mostrato di seguito:

    Scenario 1

    Scenario 1: il server di backend risponde con il codice di stato 204 No Content contenente il corpo della risposta e/o una delle intestazioni elencate in Possibili cause.

    Prendi nota dei seguenti valori dalla traccia:

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

    Scenario 2

    Scenario 2: il server di backend risponde con il codice di stato 204 No Content contenente il corpo della risposta e/o una delle intestazioni elencate in Possibili cause.

    Prendi nota dei seguenti valori dalla traccia:

    • error: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. Vai alla fase AX (Dati di analisi registrati) nella traccia e fai clic su di essa.
  7. Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni errore e determina i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    ( visualizza immagine più grande)

  8. Tieni presente che i valori di X-Apigee-fault-code e X-Apigee-fault-source are protocol.http.ResponseWithBody e target rispettivamente. Ciò indica che l'errore si è verificato perché il server di backend ha inviato un codice di stato 204 No Content o 205 Reset Content con il corpo della risposta e/o una delle intestazioni menzionate in Possibili cause.
    Errore Valore
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

Per diagnosticare l'errore utilizzando i log degli accessi NGINX:

  1. Se sei un utente di Private Cloud, puoi utilizzare i log degli accessi NGINX per determinare le informazioni chiave su HTTP 502 Bad Gateway.
  2. Controlla i log degli accessi NGINX:

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

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  3. Cerca se sono presenti errori 502 con il codice di errore protocol.http.ResponseWithBody durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con 502.
  4. Se trovi errori 502 con X-Apigee-fault-code corrispondente al valore di protocol.http.ResponseWithBody, determina il valore di X-Apigee-fault-source.

    Esempio di errore 502 dal log degli accessi NGINX:

    La voce di esempio riportata sopra dal log degli accessi NGINX ha i seguenti valori per X- Apigee-fault-code e X-Apigee-fault-source:

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. Tieni presente che i valori di X-Apigee-fault-code e X-Apigee-fault-source sono protocol.http.ResponseWithBody e target rispettivamente. Ciò indica che l'errore si è verificato perché il server di backend ha inviato un codice di stato 204 No Content o 205 Reset Content con il corpo della risposta e/o una delle intestazioni menzionate in Possibili cause.

Causa: corpo della risposta o intestazioni con risposta 204 dal server di backend

Diagnosi

  1. Determina il Codice di errore e l'Origine errore per l'errore osservato utilizzando il monitoraggio delle API lo strumento Traccia o i log degli accessi NGINX, come spiegato in Passaggi comuni per la diagnosi.
  2. Se il Codice di errore è protocol.http.ResponseWithBody e Origine errore ha il valore target, significa che il server di backend ha risposto con un codice di stato 204 No Content o 205 Reset Content con il corpo della risposta e/o una delle intestazioni menzionate in Possibili cause.
  3. Per verificare se il server di backend ha effettivamente inviato un corpo del payload della risposta e/o uno o più delle intestazioni menzionate in Possibili cause, puoi seguire questi passaggi:

    1. Se sei un utente di Public Cloud e puoi effettuare la stessa richiesta API al server di backend direttamente da uno dei tuoi sistemi.

    2. Se sei un utente di Private Cloud, puoi effettuare la stessa richiesta API al server di backend direttamente da uno dei processori di messaggi associati all'organizzazione e all'ambiente specifici in cui si è verificato l'errore.
    3. Esamina la risposta ricevuta dal server di backend e verifica che contenga un corpo del payload della risposta e/o una o più delle intestazioni menzionate sopra. In caso affermativo, questa è la causa dell'errore.

      Esempio 1

      Esempio 1: risposta del server di backend 204 con intestazione 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
      

      In questo esempio, il server di backend ha risposto con 204 No Content codice di stato e Content-Encoding: gzip

      Esempio 2

      Esempio 2: risposta del server di backend 204 con intestazione 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
      

      In questo esempio, il server di backend ha risposto con 204 No Content codice di stato e Content-Length: 48

      Esempio 3

      Esempio 3: risposta del server di backend 205 con corpo della risposta

      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
      

      In questo esempio, il server di backend ha risposto con 205 Reset Content codice di stato con corpo della risposta This is a sample Response.

    4. In tutti gli esempi precedenti, il server di backend ha inviato 204 No Content o 205 Reset Content codice di stato con il corpo della risposta e/o una delle intestazioni menzionate in Possibili cause.
    5. Pertanto, Apigee Edge ha inviato 502 Bad Gateway codice di stato con codice di errore protocol.http.ResponseWithBody.

Risoluzione

Assicurati che il server di backend rispetti sempre le specifiche RFC 7231, sezione 6.3.6: 205 Reset Content, quando invia la risposta 204 No Content o 205 Reset Content ad Apigee Edge. Ovvero, il server di backend NON DEVE inviare quanto segue come parte di una risposta 204 No Content o 205 Reset Content:

  1. Corpo del payload della risposta
  2. E una delle seguenti intestazioni:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Specifica

Apigee Edge risponde con il codice di stato 502 Bad Gateway e il codice di errore protocol.http.ResponseWithBody se il server di backend invia una risposta 204 No Content o 205 Reset Content, ma non rispetta le seguenti specifiche RFC:

Specifica
RFC 7231, sezione 6.3.5: 204 No Content
RFC 7231, sezione 6.3.6: 205 Reset Content

Punti chiave da tenere presenti

La soluzione consigliata è correggere il server di backend in modo che invii il codice di stato 204 No Content e 205 Reset Content senza il corpo della risposta e senza le intestazioni Content-Length, Content-Encoding e Transfer-Encoding e che rispetti le specifiche RFC 7231, sezione 6.3.5: 204 No Content e RFC 7231, sezione 6.3.6: 205 Reset Content.

Se hai ancora bisogno dell'assistenza di Apigee, vai a Raccogliere le informazioni di diagnostica necessarie.

Raccogliere le informazioni di diagnostica necessarie

Raccogli le seguenti informazioni di diagnostica e poi contatta l'assistenza Apigee Edge:

Se sei un utente di Public Cloud, fornisci le seguenti informazioni:

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Comando curl completo utilizzato per riprodurre l'errore 502
  • File di traccia per le richieste API

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle proxy API
  • File di traccia per le richieste API
  • Log degli accessi NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Dove: ORG, ENV e PORT# vengono sostituiti con i valori effettivi.

  • Log di sistema del processore di messaggi /opt/apigee/var/log/edge-message-processor/logs/system.log