502 Gateway non valido - DecompressionFailureAtResponse

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP di 502 Bad Gateway con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse come risposta all'API chiamate.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 502 Bad Gateway

Inoltre, potresti visualizzare un messaggio di errore simile a quello mostrato di seguito:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

Possibili cause

Questo errore si verifica solo se:

  • La codifica specificata nell'intestazione Risposta HTTP (dal server backend/di destinazione) Content-Encoding è valido e supportata da Apigee Edge,
  • MA

  • Il formato del payload inviato dal server backend/di destinazione come parte della risposta HTTP. non corrisponde al formato di codifica specificato nell'intestazione Content-Encoding

Questo perché Apigee Edge non riesce a decodificare il payload utilizzando la codifica specificata, poiché del payload non sia nello stesso formato della codifica specificata nel Intestazione Content-Encoding.

Ecco alcuni esempi di valori Content-Encoding supportati e di come Apigee Edge prevede che la rappresentazione del payload sia in questi casi:

Scenario Content-Encoding Rappresentazione del payload
Codifica singola gzip

Il formato Unix gzip.

Consulta Formato GZIP RFC1952.

Codifica singola sgonfiare

Questo formato utilizza la struttura zlib con algoritmo di compressione deflate.

Vedi RFC1950 e . RFC1951.

Codifica multipla

Codifica multipla

Ad esempio, nei casi in cui la codifica viene eseguita due volte, i casi possono essere:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • sgonfiare, sgonfiare
Più codifiche applicate al payload nell'ordine dato come appare nell'intestazione.

Le possibili cause di questo errore sono le seguenti:

Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
Il formato del payload della risposta non corrisponde alla codifica dei contenuti Il formato del payload della risposta inviato dal server backend/destinazione è non è codificato o non corrispondono alla codifica specificata nell'intestazione Content-Encoding. Utenti perimetrali di cloud pubblici e privati

Passaggi diagnostici comuni

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

Monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

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

  3. Vai al menu Analizza > Monitoraggio delle API > Esamina.
  4. Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
  5. Assicurati che il filtro Proxy sia impostato su Tutti.
  6. Traccia il codice di errore in base all'ora.
  7. Seleziona una cella con il codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse come mostrato di seguito:

    ( visualizza immagine ingrandita)

  8. Informazioni sul codice di errore Il valore messaging.adaptors.http.flow.DecompressionFailureAtResponse viene visualizzato come mostrato di seguito:

    ( visualizza immagine ingrandita)

  9. Fai clic su Visualizza log ed espandi la riga che contiene l'errore 502.

    ( visualizza immagine ingrandita)

  10. Nella finestra Log, tieni presente i seguenti dettagli:
      .
    • Codice di stato: 502
    • Origine errore:target
    • Codice di errore: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Se il campo Origine errore ha il valore target, significa che che il formato del payload della risposta non corrispondesse codifica supportata specificata nell'intestazione della risposta del server di backend Content-Encoding,

Strumento Trace

Per diagnosticare l'errore utilizzando lo strumento Trace:

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

  3. Seleziona una delle risposte con errori ed esamina la traccia.
  4. Navigare attraverso le diverse fasi della traccia e individuare il punto in cui si è verificato l'errore si è verificato un errore.
  5. In genere troverai l'errore in un flusso subito dopo Fase Risposta ricevuta dal server di destinazione come illustrato di seguito:

    ( visualizza immagine ingrandita)

  6. Prendi nota dei valori delle proprietà della traccia:

    • Codifica dei contenuti: gzip
    • Corpo dei contenuti della risposta: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Vai alla fase di errore subito dopo la finestra Risposta ricevuta dal server di destinazione. fase iniziale:

    ( visualizza immagine ingrandita)

    Osserva le proprietà:

    • errore: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      error.cause indica che il payload della risposta non è in formato GZIP. Ciò significa che Apigee Edge si aspettava che il payload di risposta fosse in formato GZIP è stato specificato nell'intestazione Content-Encoding (determinata nei precedenti passaggio).Per questo motivo, Apigee Edge non è in grado di decomprimere il payload utilizzando gzip e errore Decompression failure at response.

    Tieni presente che la risposta dal server di destinazione/backend è 200 in questo case; ma l'applicazione client riceverà un 502 poiché l'errore viene restituito da Apigee Edge.

  8. Passa alla fase Risposta inviata al cliente della traccia e fai clic su questa.

    ( visualizza immagine ingrandita)

    Prendi nota dei seguenti dettagli della traccia:

    • Codice di stato: 502 Bad Gateway.
    • Contenuti relativi all'errore: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Vai alla fase AX (Analytics Data Recorded) nella traccia. e fai clic su questa opzione.

  10. Scorri verso il basso fino alla sezione Dettagli fase, Intestazioni degli errori e determinare i valori di X-Apigee-fault-code e X-Apigee-fault-source come mostrato di seguito:

    ( visualizza immagine ingrandita)

  11. Vedrai i valori di X-Apigee-fault-code e X-Apigee-fault-source. come messaging.adaptors.http.flow.DecompressionFailureAtResponse e target, a indicare che il formato del payload della risposta non corrispondeva alla specificata nell'intestazione Content-Encoding.
    Intestazioni della risposta Valore
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

Per diagnosticare l'errore utilizzando i log di accesso NGINX:

  1. Se sei un utente Private Cloud, puoi utilizzare i log di accesso NGINX per determinare le informazioni chiave sugli errori HTTP 502.
  2. Controlla i log di accesso NGINX:

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

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

  3. Cerca per vedere se si sono verificati 502 errori durante un intervallo di tempo specifico (se il problema si è verificato in passato) o se sono presenti risposte con errori ancora 502.
  4. Se riscontri errori 502 con il X-Apigee-fault-code corrispondente al valore di messaging.adaptors.http.flow.DecompressionFailureAtResponse, quindi determinare il valore della X-Apigee-fault-source.

    Esempio di errore 502 nel log di accesso NGINX:

    La voce di esempio riportata sopra del log di accesso NGINX ha i seguenti valori per X-Apigee-fault-code e X-Apigee-fault-code

    Intestazioni della risposta Valore
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Causa: il formato del payload della risposta non corrisponde alla codifica dei contenuti

Per impostazione predefinita, Apigee Edge decomprime sempre il payload se l'intestazione della risposta Content-Encoding contiene un valore valido e un supportata. Pertanto, si prevede che il formato del payload della risposta deve corrispondere alla codifica specificata nell'intestazione della risposta Content-Encoding. In caso di mancata corrispondenza, viene visualizzato questo errore.

Diagnosi

  1. Determinare il codice di errore e l'origine errore per l'errore osservato utilizzando l'API Log di accesso di Monitoring, dello strumento Trace o di NGINX, come spiegato in Passaggi comuni per la diagnosi.
  2. Se il codice di errore è messaging.adaptors.http.flow.DecompressionFailureAtResponse e Origine errore ha il valore target, allora questo indica che il formato del payload della risposta inviato dal server backend/destinazione non corrisponde codifica supportata specificata nell'intestazione della risposta Content-Encoding.
  3. Puoi determinare la mancata corrispondenza come parte della risposta HTTP utilizzando uno dei seguenti metodo:

    Messaggio di errore

    Per eseguire la convalida utilizzando il messaggio di errore:

    1. Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, consulta il faultstring.

      Esempio di messaggio di errore:

      "faultstring":"Decompression failure at response"
      
    2. Nel messaggio di errore riportato sopra, viene visualizzato "Decompression failure at response", che implica che la risposta non possono essere decompressi utilizzando la codifica specificata nel Content-Encoding intestazione.

    Trace

    Per eseguire la convalida utilizzando Trace:

    1. Determina i valori di Content-Type e error.cause utilizzando Trace come spiegato in Passaggi comuni della diagnostica.
    2. I valori della traccia di esempio sono i seguenti:

      • Codifica dei contenuti: gzip
      • error.cause: Not in GZIP format

      Il valore nell'intestazione della risposta Content-Encoding è gzip; tuttavia, il payload della risposta non è in formato GZIP (come indicato da error.cause). Pertanto, Apigee Edge risponde 502 Bad Gateway e codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Richiesta effettiva

    Per eseguire la convalida utilizzando la richiesta effettiva:

    Se hai accesso alla richiesta effettiva fatta al server di destinazione/backend dell'applicazione, segui questi passaggi:

    1. Se sei un utente di un cloud pubblico/un cloud privato, effettua una richiesta direttamente al server di backend dallo stesso server di backend o da qualsiasi da cui è consentito effettuare la richiesta al server di backend.
    2. Se sei un utente del Private Cloud, puoi anche effettuare la richiesta al server di backend da uno dei processori di messaggi.
    3. Esamina la risposta inviata dal server di backend e determina il valore passato nell'intestazione della risposta Content-Encoding.
    4. Determina il formato del payload inviato come parte della richiesta.
    5. Se il valore dell'intestazione Content-Encoding è nell'elenco di supportata, ma il formato del payload della risposta sì non corrisponde alla codifica specificata nell'intestazione Content-Encoding, questa è la causa del problema.

      Esempio:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      La risposta di esempio precedente invia il valore gzip al Content-Encoding, che è un'intestazione . supportata in Apigee Edge. Tuttavia, response_payload.zip viene inviato come file ZIP. Pertanto, la risposta non va a buon fine e viene restituito un errore 502 Bad Gateway con il codice di errore: messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Log del processore di messaggi

    Per eseguire la convalida utilizzando i log del processore di messaggi:

    Se sei un utente Private Cloud, puoi utilizzare i log del processore di messaggi per determinare le informazioni chiave sugli errori HTTP 502.

    1. Controlla il log del processore di messaggi:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Cerca se ci sono errori 502 durante un intervallo specifico durata (se il problema si è verificato in passato) o se sono presenti risposte non funziona ancora con 502. Puoi utilizzare la seguente stringa di ricerca:

      grep -ri "ZipException"
      
    3. Nel file system.log troverai righe simili a quelle che seguono:

      Scenario 1

      Scenario 1: quando la risposta dell'API ha l'intestazione Content-Encoding: gzip

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      La riga java.util.zip.ZipException: Not in GZIP format nel messaggio di errore precedente indica che la risposta il payload non viene inviato in formato GZIP anche se il file Content-Encoding è specificato come gzip. Pertanto, Apigee Edge genera l'eccezione restituisce un codice di stato 502 con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse alle applicazioni client.

      Scenario 2

      Scenario 2: quando la risposta dell'API ha l'intestazione Content-Encoding: deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      Le linee java.util.zip.ZipException: incorrect header check e Caused by: java.util.zip.DataFormatException: incorrect header check nel messaggio di errore riportato sopra indicano che il payload della risposta non è stato inviato deflate e non corrisponde alla codifica specificata nel Content-Encoding di deflate. Pertanto, Apigee Edge genera l'eccezione e restituisce un codice di stato 502 con codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse alle applicazioni client.

Risoluzione

  1. Se non è necessario il payload della risposta compressa nel flusso proxy API in Apigee Edge e nel server di backend, non passare l'intestazione Content-Encoding. Se è necessario comprimere il payload di risposta, vai al passaggio 2.
  2. Se è necessario comprimere il payload della risposta, assicurati che il server di backend invia sempre quanto segue:
    • Uno degli supportata come valore per l'intestazione Content-Encoding nel risposta
    • Il payload di risposta nel formato supportato per Apigee Edge corrisponde alla codifica specificato nell'intestazione Content-Encoding
  3. Nell'esempio discusso sopra, il payload della risposta è in formato ZIP, ma l'intestazione della risposta specifica Content-Encoding: gzip. Puoi risolvere il problema inviando la risposta come Content-Encoding: gzip e il payload della risposta in gzip formato:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Specifica

Apigee Edge risponde con il codice di stato 502 Bad Gateway con un codice di errore messaging.adaptors.http.flow.DecompressionFailureAtResponse in base al seguente RFC specifiche:

Specifica
RFC 7231, sezione 6.5.1
RFC 7231, sezione 3.1.2.2

Se hai ancora bisogno di aiuto dall'assistenza Apigee, vai a Raccogliere dati diagnostici.

Raccogliere dati diagnostici

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

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

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Completa il comando curl utilizzato per riprodurre l'errore 502
  • File di traccia per le risposte dell'API

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

  • Messaggio di errore completo osservato per le risposte con errori
  • Nome ambiente
  • Bundle proxy API
  • File di traccia per le risposte dell'API
  • Log di accesso NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

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