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 codice di errore
protocol.http.TooBigBody 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, potresti visualizzare il seguente messaggio di errore:
{
"fault":{
"faultstring":"Body buffer overflow",
"detail":{
"errorcode":"protocol.http.TooBigBody"
}
}
}Possibili cause
Questo errore si verifica se le dimensioni del payload inviato dal server di destinazione/backend ad Apigee Edge come parte della risposta HTTP sono superiori al limite consentito in Apigee Edge.
Ecco le possibili cause dell'errore:
| Causa | Descrizione | Istruzioni per la risoluzione dei problemi applicabili a |
|---|---|---|
| Le dimensioni del payload della risposta sono superiori al limite consentito | Le dimensioni del payload inviato dal server di destinazione/backend come parte della risposta HTTP ad Apigee sono superiori al limite consentito in Apigee. | Utenti di Edge Public e Private Cloud |
| Le dimensioni del payload della risposta superano il limite consentito dopo la decompressione | Le dimensioni del payload inviato in formato compresso dal server di destinazione/backend nell'ambito della risposta HTTP ad Apigee superano il limite consentito quando viene decompresso da Apigee. | Utenti di Edge Public e Private Cloud |
Passaggi di diagnostica comuni
Utilizza uno dei seguenti strumenti/tecniche per diagnosticare questo errore:
Monitoraggio delle API
Per diagnosticare l'errore utilizzando API Monitoring:
- Accedi alla UI di Apigee Edge come utente con un ruolo appropriato.
Passa all'organizzazione in cui vuoi esaminare il problema.
- Vai alla pagina Analizza > Monitoraggio API > Esamina.
- Seleziona il periodo di tempo specifico in cui hai osservato gli errori.
- Puoi selezionare il filtro Proxy per restringere il codice di errore.
- Traccia il codice di errore rispetto al tempo.
Seleziona una cella con il codice di errore
protocol.http.TooBigBodycome mostrato di seguito:
Visualizzerai le informazioni sul codice di errore
protocol.http.TooBigBodycome mostrato di seguito:
Fai clic su Visualizza log ed espandi la riga della richiesta non riuscita.
- Nella finestra Log, prendi nota dei seguenti dettagli:
- Codice di stato:
502 - Origine del guasto:
target - Codice errore:
protocol.http.TooBigBody.
- Codice di stato:
- Se Fault Source ha il valore
targete Fault Code ha il valoreprotocol.http.TooBigBody, significa che la risposta HTTP dal server di destinazione/ backend ha una dimensione del payload di risposta maggiore del limite consentito in Apigee Edge.
Traccia
Per diagnosticare l'errore utilizzando lo strumento Trace:
- Attiva l'opzione Traccia sessione e una delle seguenti:
- Attendi che si verifichi l'errore
502 Bad Gatewayoppure - Se riesci a riprodurre il problema, effettua la chiamata API e riproduci
l'errore
502 Bad Gateway.
- Attendi che si verifichi l'errore
- Seleziona una delle richieste non riuscite ed esamina la traccia.
- Esamina le diverse fasi della traccia e individua il punto in cui si è verificato l'errore.
Vai alla fase Errore subito dopo la fase Risposta ricevuta dal server di destinazione, come mostrato di seguito:
Prendi nota dei valori dell'errore dalla traccia:
- Errore:
Body buffer overflow - error.class:
com.apigee.errors.http.server.BadGateway
Ciò indica che Apigee Edge (componente processore di messaggi) genera l'errore non appena riceve la risposta dal server di backend a causa delle dimensioni del payload che superano il limite consentito.
- Errore:
Vedrai l'errore nella fase Risposta inviata al client, come mostrato di seguito:
- Prendi nota dei valori dell'errore dalla traccia. La traccia di esempio riportata sopra mostra:
- Errore:
502 Bad Gateway - Contenuti errore:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- Errore:
Vai alla fase Risposta ricevuta dal server di destinazione, come mostrato di seguito per diversi scenari:
Non compresso
Scenario 1: payload della risposta inviato in formato non compresso
Prendi nota dei valori dell'errore dalla traccia:
- Risposta ricevuta dal server di destinazione:
200 OK - Content-Length (dalla sezione Intestazioni delle risposte): circa 11 MB
Compresso
Scenario n. 2: payload della richiesta inviato in formato compresso
Prendi nota dei valori dell'errore dalla traccia:
- Risposta ricevuta dal server di destinazione:
200 OK - Content-Encoding: se vedi questa intestazione nella sezione Intestazioni della risposta, prendi nota del valore. Ad esempio, in questo esempio il valore è
gzip.
- Risposta ricevuta dal server di destinazione:
Prendi nota del corpo nella sezione Contenuto della risposta:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}Vai alla fase AX (Analytics Data Recorded) nella traccia e fai clic per visualizzare i dettagli correlati.
- Scorri verso il basso in Dettagli fase fino alla sezione Variabili lette e determina i valori di
target.received.content.lengthche indica:- Le dimensioni effettive del payload della risposta quando viene inviato in formato non compresso e
- Le dimensioni del payload di risposta dopo la decompressione da parte di Apigee, quando il payload viene inviato in formato compresso. Sarà sempre uguale al valore del limite consentito (10 MB) in questo scenario.
Non compresso
Scenario 1: payload della risposta inviato in formato non compresso
Prendi nota del valore di target.received.content.length:
Intestazioni delle richieste Valore target.received.content.length ~11 MB Compresso
Scenario 2: payload della richiesta inviato in formato compresso
Prendi nota del valore di target.received.content.length:
Intestazioni della richiesta Valore target.received.content.length ~10 MB La tabella seguente spiega perché Apigee restituisce l'errore
502nei due scenari in base al valore di target.received.content.length:Scenario Valore di target.received.content.length Motivo dell'errore Payload risposta in formato non compresso ~11 MB Dimensioni > limite consentito di 10 MB Payload risposta in formato compresso ~10 MB Limite di dimensioni superato dopo la decompressione
NGINX
Per diagnosticare l'errore utilizzando i log di accesso NGINX:
- Se sei un utente di Private Cloud, puoi utilizzare i log di accesso NGINX per determinare
le informazioni chiave sugli errori HTTP
502. Controlla i log di accesso 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.
- Cerca per vedere se si sono verificati
502errori durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono ancora presenti richieste non riuscite con502. - Se trovi errori
502con X-Apigee-fault-code che corrisponde al valore diprotocol.http.TooBigBody, determina il valore di X-Apigee-fault-source.Esempio di errore 502 dal 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-source:
Intestazioni della risposta Valore X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source target
Causa: le dimensioni del payload della risposta sono superiori al limite consentito
Diagnosi
- Determina il codice di errore, l'origine dell'errore e le dimensioni del payload di risposta per l'errore osservato utilizzando API Monitoring, lo strumento Trace o i log di accesso NGINX come spiegato in Passaggi comuni per la diagnosi con lo scenario n. 1.
- Se l'origine dell'errore ha il valore
target, significa che le dimensioni del payload della risposta inviata dal server di destinazione/backend ad Apigee sono superiori al limite consentito in Apigee Edge. - Verifica le dimensioni del payload della risposta come determinato nel passaggio 1.
- Se la dimensione del payload è superiore al limite consentito di 10 MB, questo è il motivo dell'errore.
- Se le dimensioni del payload sono circa 10 MB, il limite consentito, è possibile che il payload della risposta venga passato in formato compresso. Vai a Causa: le dimensioni del payload della risposta superano il limite consentito dopo la decompressione.
- Verifica che le dimensioni del payload della risposta siano effettivamente superiori al limite consentito di 10 MB controllando la
risposta effettiva seguendo questi passaggi:
- Se non hai accesso alla richiesta effettiva inviata al server di destinazione/backend, vai a Risoluzione.
- Se hai accesso alla richiesta effettiva inviata al server di destinazione/backend, esegui i seguenti passaggi:
- Se sei un utente di cloud pubblico/cloud privato, invia una richiesta direttamente al server di backend dal server di backend stesso o da qualsiasi altra macchina da cui ti è consentito inviare la richiesta al server di backend.
- Se sei un utente di Private Cloud, puoi anche inviare la richiesta al server di backend da uno dei Message Processor.
- Verifica le dimensioni del payload passato nella risposta controllando l'intestazione Content-Length.
- Se le dimensioni del payload superano il limite consentito in Apigee Edge, questo è il motivo del problema.
Esempio di risposta dal server di backend:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
Nell'esempio precedente, puoi notare che
Content-Length: 11534336 (which is ~11 MB)è la causa di questo errore, in quanto supera il limite consentito in Apigee Edge.
Risoluzione
Fai riferimento alla sezione Risoluzione.
Causa: le dimensioni del payload della risposta superano il limite consentito dopo la decompressione
Se il payload della risposta viene inviato in formato compresso e l'intestazione della risposta
Content-Encoding è impostata su gzip, , Apigee decomprime il payload della risposta. Durante il processo di decompressione, se Apigee rileva che le dimensioni del payload sono superiori
al limite consentito in Apigee Edge, interrompe l'ulteriore
decompressione e risponde immediatamente
con 502 Bad Gateway e il codice di errore protocol.http.TooBigBody.
Diagnosi
- Determina il codice di errore,l'origine dell'errore e le dimensioni del payload di risposta per l'errore osservato utilizzando API Monitoring, Trace Tool o i log di accesso NGINX come spiegato in Passaggi comuni per la diagnosi con lo scenario n. 2.
- Se Fault Source ha il valore
target, significa che le dimensioni del payload di risposta inviato dall'applicazione di destinazione/backend ad Apigee sono maggiori del limite consentito in Apigee Edge. - Verifica le dimensioni del payload della risposta come determinato nel passaggio 1.
- Se la dimensione del payload è superiore al limite consentito di 10 MB, questo è il motivo dell'errore.
- Se le dimensioni del payload sono pari al limite consentito di circa 10 MB, è possibile che il payload della risposta venga trasmesso in formato compresso. In questo caso, controlla le dimensioni non compresse del payload della risposta compressa.
- Puoi verificare se la risposta dalla destinazione/dal backend è stata inviata in formato compresso e
se la dimensione non compressa era superiore al limite consentito utilizzando uno dei seguenti
metodi:
Traccia
Utilizzo dello strumento Traccia:
- Se hai acquisito una traccia per la richiesta non riuscita, consulta i passaggi descritti in
Traccia e
- Determina il valore di target.received.content.length
- Verifica se la richiesta del client conteneva l'intestazione
Content-Encoding:
gzip
- Se il valore di target.received.content.length è vicino al limite consentito di 10 MB e l'intestazione della risposta Content-Encoding:
gzip, allora questa è la causa dell'errore.
Richiesta effettiva
Utilizzo della richiesta effettiva:
- Se non hai accesso alla richiesta effettiva inviata al server di destinazione/backend, vai a Risoluzione.
- Se hai accesso alla richiesta effettiva inviata al server di destinazione/backend, esegui i seguenti passaggi:
- Verifica le dimensioni del payload passato nella risposta insieme all'intestazione
Content-Encodinginviata nella risposta. - Se noti che l'intestazione della risposta
Content-Encodingè impostata sugzipe le dimensioni non compresse del payload sono superiori al limite consentito in Apigee Edge, questo è il motivo dell'errore.Risposta di esempio ricevuta dal server di backend:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
Nell'esempio precedente, l'intestazione
Content-Encoding: gzipviene inviata e le dimensioni del filetestzippedfile.gznella risposta sono inferiori al limite, tuttavia le dimensioni del file decompressotestzippedfileerano circa 15 MB.
- Verifica le dimensioni del payload passato nella risposta insieme all'intestazione
Log del processore di messaggi
Utilizzo dei log del processore di messaggi:
- Se sei un utente di Private Cloud, puoi utilizzare i log del processore di messaggi per
determinare le informazioni chiave sugli errori HTTP
502. Controllare i log del processore di messaggi
/opt/apigee/var/log/edge-message-processor/logs/system.logCerca per verificare se si sono verificati errori
502durante un periodo di tempo specifico (se il problema si è verificato in passato) o se alcune richieste continuano a non riuscire con502. Puoi utilizzare le seguenti stringhe di ricerca:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Troverai righe da
system.logsimili a quelle mostrate di seguito (TotalReadechunkCountpotrebbero variare nel tuo caso):2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
Durante il processo di decompressione, non appena il processore di messaggi determina che i byte letti totali sono > 10 MB, si arresta e stampa la seguente riga:
Message is too large. TotalRead 10489856 chunkCount 2571Ciò implica che le dimensioni del payload di risposta sono superiori a 10 MB e Apigee genera l'errore quando le dimensioni iniziano a superare il limite di 10 MB con il codice di errore
protocol.http.TooBigBody
- Se hai acquisito una traccia per la richiesta non riuscita, consulta i passaggi descritti in
Traccia e
Risoluzione
Dimensioni fisse
Opzione 1 [consigliata]: correggi l'applicazione del server di destinazione in modo che non invii dimensioni del payload superiori al limite di Apigee
- Analizza il motivo per cui il server di destinazione specifico invia dimensioni della risposta / del payload superiori al limite consentito, come definito in Limiti.
- Se non è auspicabile, modifica l'applicazione del server di destinazione in modo che invii dimensioni della risposta / del payload inferiori al limite consentito.
- Se è auspicabile e vuoi inviare una risposta/payload superiore al limite consentito, vai alle opzioni successive.
Pattern URL firmato
Opzione 2 [consigliata]: utilizza il pattern degli URL firmati all'interno di un'Apigee JavaCallout
Per i payload di dimensioni superiori a 10 MB, Apigee consiglia di utilizzare un pattern di URL firmati all'interno di un JavaCallout Apigee, come illustrato nell'esempio Edge Callout: Signed URL Generator su GitHub.
Streaming
Opzione 3: utilizza lo streaming
Se il proxy API deve gestire richieste e/o risposte molto grandi, puoi abilitare lo streaming in Apigee.
CwC
Opzione 4: utilizza la proprietà CwC per aumentare il limite del buffer
Questa opzione deve essere utilizzata solo quando non è possibile utilizzare nessuna delle opzioni consigliate, in quanto potrebbero verificarsi problemi di prestazioni se le dimensioni predefinite vengono aumentate.
Apigee fornisce una proprietà CwC che consente di aumentare il limite delle dimensioni del payload di richiesta e risposta. Per maggiori dettagli, consulta Impostare il limite di dimensioni dei messaggi sul router o sul processore di messaggi.
Limiti
Apigee prevede che l'applicazione client e il server di backend non inviino dimensioni del payload superiori al limite consentito, come documentato per
Request/response size in
Limiti di Apigee Edge.
- Se sei un utente del cloud pubblico, il limite massimo per le dimensioni del payload di richiesta e risposta
è quello documentato per
Request/response sizein Limiti di Apigee Edge. - Se sei un utente di Private Cloud , potresti aver modificato il limite massimo predefinito per le dimensioni del payload di richiesta e risposta (anche se non è una pratica consigliata). Puoi determinare il limite massimo delle dimensioni del payload della richiesta seguendo le istruzioni riportate in Come controllare il limite attuale.
Come faccio a controllare il limite attuale?
Questa sezione spiega come verificare che la proprietà
HTTPResponse.body.buffer.limit sia stata aggiornata con un nuovo valore nei processori di messaggi.
Sulla macchina processore di messaggi, cerca la proprietà
HTTPResponse.body.buffer.limitnella directory/opt/apigee/edge-message- processor/confe controlla il valore impostato come mostrato di seguito:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
Il risultato di esempio del comando precedente è il seguente:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
Nell'output di esempio riportato sopra, nota che la proprietà
HTTPResponse.body.buffer.limitè stata impostata con il valore10minhttp.properties.Ciò indica che il limite per le dimensioni del payload della richiesta configurato in Apigee per Private Cloud è 10 MB.
Se hai ancora bisogno di assistenza da parte dell'assistenza Apigee, vai a Informazioni di diagnostica da raccogliere.
Deve raccogliere informazioni diagnostiche
Raccogli le seguenti informazioni diagnostiche e poi contatta l'assistenza Apigee Edge:
Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome organizzazione
- Nome ambiente
- Nome del proxy API
- Comando curl completo utilizzato per riprodurre l'errore
502 - File di traccia per le richieste API
- Output completo della risposta dal server di destinazione/backend insieme alle dimensioni del payload
Se sei un utente di Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato per le richieste non riuscite
- Nome organizzazione
- Nome ambiente
- Bundle proxy API
- File di traccia per le richieste API non riuscite
- Comando curl completo utilizzato per riprodurre l'errore
502 - Output completo della risposta dal server di destinazione/backend insieme alle dimensioni del payload
Log di accesso NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logDove: 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