502 Bad Gateway - ResponseWithBody

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

Sintomo

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

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 502 Bad Gateway

Inoltre, potrebbe essere visualizzato 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 Nessun contenuto e RFC 7231, sezione 6.3.6: 205 Reset Content, dal server di origine non dovrebbero essere inviati 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 la dimensione, il tipo o il formato del payload della risposta.

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

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

Content-Length intestazione

(impostato su un valore diverso da zero)

ERRORE ERRORE

Content-Encoding

(impostata su codifica supportata in Apigee Edge)

ERRORE NESSUN ERRORE
Transfer-Encoding ERRORE ERRORE

Di seguito sono riportate 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 risposta 204 No Content o 205 Reset Content con un corpo della risposta e/o una o più intestazioni Content-Type, Content-Encoding o Transfer-Encoding. Utenti di cloud pubblico e privato perimetrale

Passaggi di diagnosi più comuni

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

Monitoraggio delle API

Per diagnosticare l'errore utilizzando il monitoraggio delle API:

  1. Accedi alla UI 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 il periodo di tempo specifico in cui hai riscontrato gli errori.
  5. Traccia Codice di errore su Ora.
  6. Seleziona una cella con il codice di errore protocol.http.ResponseWithBody come mostrato di seguito:

    ( visualizza immagine ingrandita)

  7. Vedrai le informazioni relative al codice di errore protocol.http.ResponseWithBody, come mostrato di seguito:

    ( visualizza immagine ingrandita)

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

    ( visualizza immagine ingrandita)

  9. Nella finestra Log, prendi nota dei seguenti dettagli:
    • Codice di stato: 502
    • Origine errore: target
    • Codice di errore: protocol.http.ResponseWithBody.
  10. Se l'Origine errore ha il valore target e il 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 Trace:

  1. Abilita la sessione di traccia e:
    1. Attendi che si verifichi l'errore 502 Bad Gateway. oppure
    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 FlowInfos sia abilitata:

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

    Scenario n. 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 valori di quanto segue dalla traccia:

    • errore: 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 valori di quanto segue dalla traccia:

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

    ( visualizza immagine ingrandita)

  8. Nota che i valori di X-Apigee-fault-code e X-Apigee-fault-source are protocol.http.ResponseWithBody e target rispettivamente. Questo 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 di NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log degli accessi di NGINX per determinare le informazioni chiave su HTTP 502 Bad Gateway.
  2. Controlla i log degli accessi di 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 per vedere se si sono verificati 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 ci sono ancora richieste che continuano a non riuscire con 502.
  4. Se riscontri 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 di NGINX:

    La voce di esempio sopra riportata 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 rispettivamente protocol.http.ResponseWithBody e target. Questo 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

Diagnostica

  1. Determina il codice di errore e l'origine dell'errore per l'errore osservato mediante l'utilizzo di API Monitoring, strumento Trace o log degli accessi NGINX, come spiegato nella sezione Passaggi comuni della diagnostica.
  2. Se il codice di errore è protocol.http.ResponseWithBody e Origine dell'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 il corpo di un payload della risposta e/o una o più delle intestazioni menzionate in Possibili cause, puoi eseguire i seguenti passaggi:

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

    2. Se sei un utente 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 verifica l'errore.
    3. Esamina la risposta ricevuta dal server di backend e verifica che contenga il corpo del payload della risposta e/o una o più delle intestazioni citate in precedenza. Se sì, è 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 il codice di stato 204 No Content 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 il codice di stato 204 No Content 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 codice di stato 205 Reset Content con corpo della risposta This is a sample Response.

    4. In tutti gli esempi precedenti, 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.
    5. Di conseguenza, Apigee Edge ha inviato un codice di stato 502 Bad Gateway con codice di errore protocol.http.ResponseWithBody.

Risoluzione

Assicurati che il server di backend rispetti sempre la specifica RFC 7231, sezione 6.3.6: 205 Reset Content, quando invii la risposta 204 No Content o 205 Reset Content ad Apigee Edge. In altre parole, il server di backend DEVE inviare quanto segue come parte di una risposta 204 No Content o 205 Reset Content:

  1. Corpo payload risposta
  2. Inoltre, una qualsiasi delle seguenti intestazioni:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Specifiche

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 ottempera alle seguenti specifiche RFC:

Specifiche
RFC 7231, sezione 6.3.5: 204 Nessun contenuto
RFC 7231, sezione 6.3.6: 205 Reset Content

Punti chiave da considerare

La soluzione consigliata è correggere il server di backend affinché invii il codice di stato 204 No Content e 205 Reset Content senza corpo della risposta e qualsiasi intestazione - Content-Length, Content-Encoding e Transfer-Encoding e rispettare le specifiche RFC 7231, sezione 6.3.5: 204 No Content e RFC 7231, section 6.3.6: 205 Reset Content.

Se hai ancora bisogno di aiuto dall'Assistenza Apigee, vai alla pagina Devi raccogliere informazioni diagnostiche.

Devi raccogliere dati diagnostici

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

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome dell'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 Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome ambiente
  • Bundle del 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