502 Bad Gateway - TooBigLine

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 protocol.http.TooBigLine in risposta alle chiamate API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 502 Bad Gateway

Potresti inoltre visualizzare il seguente messaggio di errore:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Possibili cause

Questo errore si verifica se la dimensione della riga di risposta inviata dal server di destinazione/backend su Apigee Il perimetro della risposta HTTP è superiore al limite massimo consentito limite in Apigee Edge.

Prima di esaminare le possibili cause di questo errore, vediamo cosa viene dalla riga di risposta e come verificarne le dimensioni.

Informazioni sulla riga di risposta

Una tipica risposta HTTP è composta da tre parti:

  1. Riga di stato (indicata come Riga di risposta in Apigee)
  2. ( Insieme di intestazioni HTTP)
  3. [ Corpo ]

La riga di risposta è costituita da tre parti: la versione del protocollo seguita da un numero codice di stato e la frase testuale associata, come illustrato di seguito:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Quando una risposta HTTP viene inviata dall'applicazione server di destinazione/backend, la prima riga inviate rappresenta la riga di risposta come descritto sopra. Segue il intestazioni e corpo della risposta/payload.Il seguente screenshot di esempio mostra un tipico curl, la parte Richiesta e la parte Risposta (insieme alla Riga di risposta).

Informazioni sulle dimensioni della riga di risposta

  1. Nell'esempio illustrato in precedenza, anche la riga iniziale (prima riga) nella risposta denominata Riga di risposta è la seguente:

    HTTP/1.1 200 OK
    

    Questa riga di risposta ha una dimensione di ~15 bytes poiché contiene 15 ASCII characters. Poiché questo rientra tra i limite consentito in Apigee Edge, la risposta viene inviata al client senza di Apigee Edge.

  2. Analogamente, se osservi il faultstring Messaggio di errore mostrato sopra, contiene "response line size exceeding 2,048". Questo indica che la riga di risposta nella risposta HTTP inviati dal server di destinazione/backend hanno superato i 2.048 byte.

Informazioni sulla riga di risposta grande

In base alla definizione di Status-Line (denominata qui Response-Line), le tipiche richieste HTTP e risposta, la dimensione sarebbe molto inferiore al limite predefinito di 2 K definito in Apigee Edge, quindi potremmo non hai raggiunto il limite. Tuttavia, ecco alcuni possibili scenari in cui potresti superare questo limite:

  1. Il server di destinazione/backend non è un sistema HTTP. Potrebbe rispondere con un indirizzo non HTTP risposta.
  2. Il server di destinazione/backend riscontra dei problemi e invia una lunga riga di risposta come parte del protocollo risposta.

Scopri di più in merito in Errore protocollo.http.TooBigLine, "dimensione riga di risposta superiore a 2.048.

Di seguito sono riportate le possibili cause dell'errore:

Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
Le dimensioni della riga di risposta sono superiori al limite consentito La dimensione della riga di risposta inviata dal server di destinazione/backend come parte La risposta HTTP di Apigee Edge è superiore a limite consentito in Apigee Edge 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. Puoi selezionare il filtro Proxy per restringere il codice di errore.
  6. Traccia il codice di errore in base all'ora.
  7. Seleziona una cella con il codice di errore protocol.http.TooBigLine come mostrato di seguito:

    ( visualizza immagine ingrandita)

  8. Verranno visualizzate le informazioni sul codice di errore protocol.http.TooBigLine come mostrato di seguito:

    ( visualizza immagine ingrandita)

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

  10. Nella finestra Log, tieni presente i seguenti dettagli:
      .
    • Codice di stato: 502
    • Origine errore:target
    • Codice di errore: protocol.http.TooBigLine.
  11. Se Origine di errore presenta il valore target e l'errore Code ha il valore protocol.http.TooBigLine, questo indica che la risposta HTTP dal server di destinazione/ backend ha una dimensione della riga di risposta maggiore di il limite massimo consentito in Apigee Edge.

Strumento Trace

  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. Seleziona una delle richieste non riuscite ed esamina la traccia.
  3. Navigare attraverso le diverse fasi della traccia e individuare il punto in cui si è verificato l'errore si è verificato un errore.
  4. In genere l'errore è visualizzato in flowinfo Errore Dopo la fase Richiesta inviata al server di destinazione, come illustrato di seguito:

    Prendi nota dei valori dell'errore della traccia:

    • errore: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Questo indica che Apigee Edge (componente Processore di messaggi) genera l'errore come non appena riceve la risposta dal server di backend a causa delle dimensioni della riga di risposta superando il limite consentito.

  5. Visualizzerai il messaggio di errore inviato al cliente nella casella Risposta inviata a Fase client come illustrato di seguito:

    ( visualizza immagine ingrandita)

  6. Prendi nota dei valori dell'errore della traccia:
    • Errore: 502 Bad Gateway.
    • Contenuti relativi all'errore: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Puoi anche accedere alla fase AX (Analytics Data Recorded) nella traccia. e fai clic per visualizzare i dettagli dell'errore.

    ( visualizza immagine ingrandita)

    Prendi nota del valore di quanto segue:

    Intestazioni delle richieste Valore
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Contenuti dell'errore : corpo {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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 ci sono ancora richieste che non vanno a buon fine 502.
  4. Se riscontri errori 502 con il codice X-Apigee-fault-code corrispondente al valore di protocol.http.TooBigLine, quindi determina il valore della X-Apigee-fault-source.

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

    Intestazioni della risposta Valore
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

Causa: le dimensioni della riga di risposta sono superiori al limite consentito

Diagnosi

  1. Determinare il codice di errore e l'origine errore per l'errore osservato utilizzando l'API Monitoraggio, log di accesso dello strumento Trace o NGINX come spiegato in Passaggi comuni per la diagnosi.
  2. Se il campo Origine errore ha il valore target, significa che La dimensione della riga di risposta inviata dall'applicazione server di destinazione/backend ad Apigee è maggiore di limite consentito in Apigee Edge.
  3. Puoi verificare che la dimensione della riga di risposta abbia superato il limite consentito di 2 kB utilizzando una uno dei seguenti metodi:

    Messaggio di errore

    Per eseguire la convalida utilizzando il messaggio di errore:

    Se hai accesso al messaggio di errore completo ricevuto da Apigee Edge, fai riferimento alle faultstring.

    Esempio di messaggio di errore:

    "faultstring":"response line size exceeding 2,048"
    

    Il valore faultstring sopra indicato indica che le dimensioni della riga di risposta hanno superato il limite consentito di 2 kB.

    Richiesta effettiva

    Per eseguire la convalida utilizzando la richiesta effettiva:

    Se hai accesso alla richiesta effettiva fatta al server di destinazione/backend applicazione, svolgi i passaggi che seguono:

    1. Verifica le dimensioni della riga di risposta
    2. Se noti che la dimensione dell'URI è superiore a limite consentito in Apigee Edge, è la causa risolvere il problema.

      Esempio di risposta dal server di destinazione/backend:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0
      

      Nel caso precedente, la riga di risposta HTTP/1.1 200 1111…<trimmed>...11111111 è più grande di 2 kB, ovvero contiene più di 2000 caratteri ASCII.

      Se utilizzi un altro client, puoi esaminare i log del client e provare per scoprire le dimensioni della riga di risposta inviata ad Apigee Edge.

    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 verificare se le dimensioni della riga di risposta hanno superato limite consentito in Apigee Edge.

    1. Determinare l'ID messaggio della richiesta non riuscita utilizzando API Monitoring, lo strumento Trace o NGINX, come spiegato nella sezione Passaggi di diagnostica comuni.
    2. Cerca l'ID messaggio nel log del processore di messaggi:

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

    3. Troverai linee da system.log simili alle seguenti:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
      

      Il testo message = response line size exceeding 2,048 in alto indica che le dimensioni della riga di risposta sono superiori a 2 kB. Pertanto, Apigee Edge genera l'eccezione e restituisce un codice di stato 502 con il codice di errore protocol.http.TooBigline alle applicazioni client.

Risoluzione

Correggi dimensioni

Opzione 1 [consigliata]: correggi l'applicazione del server di destinazione/backend per non inviare Righe di risposta di dimensioni superiori al limite consentito

  1. Analizza il motivo per cui il client specifico invia una riga di risposta di dimensioni maggiori rispetto al limite consentito come definito in Limiti.
  2. Se non lo è, modifica l'applicazione del server di destinazione/backend in modo che invia una riga di risposta di dimensioni inferiori al limite consentito.
  3. Se è il caso e si vuole inviare una riga di risposta di dimensioni superiori a limite consentito, vai alle opzioni successive.

CwC

Opzione 2: utilizza la proprietà CwC per aumentare il limite della riga di risposta

Apigee offre un servizio CwC che le consente di aumentare il limite di dimensione della riga di risposta. Per maggiori dettagli, vedi Imposta il limite della riga di risposta sul processore di messaggi.

Limiti

Apigee si aspetta che l'applicazione client e il server di backend non inviino righe di richiesta/risposta le cui dimensioni sono superiori al limite consentito come documentato per il limite di righe di richiesta/risposta in Apigee Edge Limits.

  1. Se sei un utente del cloud pubblico, il limite massimo per richieste e La dimensione della riga di risposta è quella documentata per le dimensioni della riga di richiesta/risposta in Limiti di Apigee Edge.
  2. Se sei un utente Private Cloud , potresti aver modificato il valore massimo predefinito limite per le dimensioni delle righe di richiesta e risposta (anche se non è una pratica consigliata). Per determinare il limite massimo della dimensione della riga di risposta, segui le istruzioni riportate in Come controllare il limite attuale.

Come si controlla il limite attuale?

Questa sezione spiega come verificare che la proprietà HTTPResponse.line.limit abbia è stato aggiornato con un nuovo valore per i processori di messaggi.

  1. Cerca la proprietà sul computer HTTPResponse.line.limit in nella directory /opt/apigee/edge-message-processor/conf e controlla in vedi quale valore è stato impostato come mostrato di seguito:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Il risultato di esempio dal comando precedente è il seguente:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. Nell'output di esempio sopra riportato, puoi notare che la proprietà HTTPResponse.line.limit è stato impostato con il valore 2k in http.properties.

    Questo indica che il limite per le dimensioni della riga di risposta configurata in Apigee per i servizi privati Cloud è di 2 kB.

Se hai ancora bisogno di aiuto dall'assistenza Apigee, vai a Devi 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 richieste API

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
  • Completa il comando curl utilizzato per riprodurre l'errore 502
  • 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