504 Timeout del gateway - Timeout del router

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 504 con il messaggio Gateway Timeout in risposta alle chiamate API.

Questa risposta di errore indica che il client non ha ricevuto una risposta tempestiva da Apigee Edge o il server di backend durante l'esecuzione di una chiamata API.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 504 Gateway Time-out

Quando chiami questo proxy utilizzando cURL o un browser web, potresti visualizzare il seguente errore:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

Quali sono le cause dei timeout?

Il percorso tipico per una richiesta API tramite la piattaforma Edge è Client > Router > Messaggio Processore > Server di backend, come illustrato nella figura seguente:

Tutti i componenti del flusso di runtime Apigee Edge, inclusi client, router, messaggi I processori e i server di backend sono configurati con valori di timeout predefiniti adeguati al fine di garantire che il completamento delle richieste API non richieda troppo tempo. Se uno dei componenti della non ricevono la risposta dal componente a monte entro il periodo di tempo specificato configurazione di timeout, il componente specifico scade e solitamente restituisce un 504 Gateway Timeout.

Questo playbook descrive come risolvere un errore 504 causato da il timeout del router.

Timeout sul router

Il timeout predefinito configurato sui router in Apigee Edge è di 57 secondi. Questo è il numero massimo periodo di tempo in cui un proxy API può essere eseguito dal momento in cui la richiesta API viene ricevuta su Edge la risposta viene rinviata, inclusa la risposta del backend e tutti i criteri eseguiti. È possibile eseguire l'override del timeout predefinito sui router/host virtuali come spiegato in Configurazione del timeout di I/O sui router.

Possibili cause

In Edge, le cause tipiche dell'errore 504 Gateway Timeout causato dall'errore Il timeout del router è il seguente:

Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
Configurazione del timeout non corretta sul router Ciò accade se il router è configurato con un periodo di timeout I/O non corretto. Utenti perimetrali di cloud pubblici e privati

Passaggi diagnostici comuni

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

  • Monitoraggio delle API
  • Log di accesso NGINX

Monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

  1. Vai al menu Analizza > Monitoraggio delle API > Esamina.
  2. Filtra per 5xx errori e seleziona il periodo di tempo.
  3. Traccia il Codice di stato in base all'Ora.
  4. Fai clic sulla cella specifica che mostra 504 errori per visualizzare ulteriori dettagli e visualizzare log relativi a questi errori, come illustrato di seguito:

    Esempio di errore 504

  5. Nel riquadro a destra, fai clic su Visualizza log.

    Nella finestra Log del traffico, prendi nota dei seguenti dettagli per alcuni errori 504:

    • Richiesta: fornisce il metodo di richiesta e l'URI utilizzati per effettuare le chiamate
    • Tempo di risposta: fornisce il tempo totale trascorso per la richiesta.

    Nell'esempio precedente,

    • La richiesta rimanda a GET /test-timeout.
    • Il Tempo di risposta è pari a 57.001 secondi. Ciò indica che il router si è verificato un timeout prima che il processore di messaggi possa rispondere perché il valore è molto vicino al timeout I/O predefinito impostato sul router, che è 57 secondi.

    Puoi inoltre ottenere tutti i log utilizzando lo strumento Monitoraggio API API GET logs. Ad esempio, eseguendo query sui log per org, env, timeRange, e status, potresti scaricare tutti i log per le transazioni in cui il timeout del client.

    Poiché il monitoraggio delle API imposta il proxy su - (non impostato) per questi 504 errori, puoi usare l'API (Log API) per recuperare il proxy associato per l'host virtuale e il percorso.

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. Controlla il Tempo di risposta per verificare la presenza di altri 504 errori e controlla per vedere se il Tempo di risposta è coerente (il valore di timeout di I/O impostato sul router che è di 57 secondi) per tutti gli errori 504.

Log di accesso NGINX

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

  1. Controlla i log di accesso NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Cerca per vedere se ci sono errori 504 durante un periodo di tempo specifico (se il problema si è verificato in passato) o se ci sono ancora richieste che non vanno a buon fine 504.
  3. Prendi nota delle seguenti informazioni per alcuni errori di tipo 504:
    • Tempo di risposta
    • URI della richiesta

    In questo esempio vediamo le seguenti informazioni:

    • Tempo di richiesta: 57.001 secondi. Ciò indica che Timeout del router dopo 57.001 secondi.

    • Richiesta: GET /test-timeout
    • Alias host: myorg-test.apigee.net
  4. Verifica che l'Ora della richiesta corrisponda al timeout di I/O configurato sul router/host virtuale. Se sì, significa che il router ha avuto un timeout prima della Il processore di messaggi non ha risposto entro questo periodo.

    Nell'esempio di voce del log di accesso NGINX mostrato sopra, il campo Request Il tempo di 57.001 secondi è molto vicino al timeout di I/O predefinito impostato sul router. Questo indica chiaramente che il router ha avuto un timeout prima del messaggio Il processore potrebbe rispondere.

  5. Determinare il proxy API per il quale è stata effettuata la richiesta utilizzando il percorso di base nella Campo Richiesta .

Causa: configurazione del timeout non corretta sul router

Diagnosi

  1. Determina se gli errori 504 sono causati da un timeout del router prima del giorno il processore di messaggi potrebbe rispondere. A questo scopo, controlla se Response Time (Tempo di risposta) in Monitoraggio API/Request Time (Ora della richiesta) nel router (entrambi i campi) rappresentano le stesse informazioni,ma sono chiamati con nomi diversi) corrisponde ai Timeout I/O configurato sul router/host virtuale e sui campi Origine errore, Errore Proxy e Fault Code sono impostati su - tramite il monitoraggio delle API o l'accesso NGINX come spiegato in Passaggi di diagnostica comuni.
  2. Verifica che il valore di timeout di I/O configurato sul router o su un host virtuale specifico sia inferiore rispetto a quello configurato sul processore di messaggi o sul proxy API specifico.

    A tale scopo, segui i passaggi descritti in questa sezione.

Verifica del timeout di I/O sugli host virtuali

UI Edge

Per verificare il timeout dell'host virtuale utilizzando la UI Edge:

  1. Accedi alla UI Edge.
  2. Vai ad Amministrazione > Host virtuali.
  3. Seleziona un ambiente specifico in cui si verifica il problema di timeout.
  4. Seleziona l'host virtuale specifico per il quale vuoi verificare il valore di timeout di I/O.
  5. In Proprietà, visualizza il valore Timeout lettura proxy in secondi.

    Nell'esempio precedente, il Timeout lettura proxy è configurato con il valore 120. Ciò significa che il timeout di I/O configurato su questo host virtuale è di 120 secondi.

API di gestione

Puoi anche verificare il Timeout lettura proxy utilizzando le seguenti API di gestione:

  1. Esegui la Recupera l'API virtual host per ottenere la configurazione virtualhost come mostrato di seguito:

    Utente cloud pubblico

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Utente Private Cloud

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Dove:

    ORGANIZATION_NAME è il nome dell'organizzazione

    ENVIRONMENT_NAME è il nome dell'ambiente

    VIRTUALHOST_NAME è il nome dell'host virtuale

  2. Controlla il valore configurato per la proprietà proxy_read_timeout

    Esempio di definizione host virtuale

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }
    

    Nell'esempio precedente, proxy_read_timeout è configurato con il valore 120. Ciò significa che il timeout di I/O configurato su questo host virtuale è 120 secondi.

di Gemini Advanced.

Verifica del timeout di I/O sul file router.properties

  1. Accedi a un router.
  2. Cerca la proprietà proxy_read_timeout nel directory /opt/nginx/conf.d e controllare se è stata impostata con il nuovo valore come segue:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Controlla il valore impostato per la proprietà proxy_read_timeout nello specifico di configurazione dell'host.

    Esempio di risultato del comando grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
    

    Nell'output di esempio riportato sopra, puoi notare che la proprietà proxy_read_timeout ha è stato impostato con il nuovo valore 57 in 0-default.conf, che è di configurazione predefinito per l'host virtuale predefinito. Questo indica che il timeout di I/O configurato su 57 secondi sul router per l'host virtuale predefinito. Se disponi se si tratta di più host virtuali, le informazioni verranno visualizzate per ognuno di essi. Ottieni il valore di proxy_read_timeout per l'host virtuale specifico che hai utilizzato per creare l'API chiamate non riuscite con 504 errori.

Verifica del timeout di I/O nel proxy API

Puoi visualizzare il timeout di I/O come segue:

  • Endpoint di destinazione del proxy API
  • Norme ServiceCallout del proxy API
Visualizza il timeout di I/O nell'endpoint di destinazione del proxy API
  1. Nella UI Edge, seleziona il proxy API specifico in cui desideri visualizzare l'I/O di timeout.
  2. Seleziona l'endpoint di destinazione specifico che vuoi controllare.
  3. Visualizza la proprietà io.timeout.millis con un valore appropriato sotto la Elemento <HTTPTargetConnection> in TargetEndpoint configurazione.

    Ad esempio, il timeout I/O nel codice che segue è impostato su 120 secondi:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
Visualizza il timeout I/O nel criterio ServiceCallout del proxy API
  1. Nella UI Edge, seleziona il proxy API specifico in cui desideri visualizzare il nuovo I/O di timeout per il criterio ServiceCallout.
  2. Seleziona lo specifico criterio ServiceCallout che vuoi controllare.
  3. Visualizza l'elemento <Timeout> con un valore appropriato sotto la Configurazione di <ServiceCallout>.

    Ad esempio, il timeout I/O del seguente codice sarà 120 secondi:

    <Timeout>120000</Timeout>
    

Verifica del timeout di I/O sui processori di messaggi

  1. Accedi al computer del processore di messaggi.
  2. Cerca la proprietà HTTPTransport.io.timeout.millis nel /opt/apigee/edge-message-processor/conf utilizzando il comando seguente:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    Esempio di output

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
    
  3. Nell'output di esempio precedente, nota che la proprietà HTTPTransport.io.timeout.millis è stato impostato con il valore 55000 in http.properties. Questo indica che il timeout di I/O è stato configurato correttamente 55 secondi sul processore di messaggi.

Una volta determinato il timeout configurato sul router e sul processore di messaggi, verifica se Il router/l'host virtuale è stato configurato con un valore di timeout inferiore rispetto a quello della Processore di messaggi/proxy API.

Prendi nota dei valori impostati su tutti i livelli, come illustrato nella tabella seguente:

Timeout sul router (secondi) Timeout sull'host virtuale (secondi) Timeout sul processore di messaggi (secondi) Timeout sul proxy API (secondi)
57 - 55 120

In questo esempio,

  • Il valore predefinito di 57 secondi è configurato sul router.
  • Il valore di timeout non è impostato sull'host virtuale specifico. Ciò significa che utilizzerà il valore predefinito di 57 secondi configurato sul router stesso.
  • Nel processore di messaggi viene configurato un valore predefinito di 55 secondi.
  • Tuttavia, nel proxy API specifico viene configurato un valore di 120 secondi.

Tieni presente che il valore di timeout più alto è configurato solo sul proxy API, ma il router è ancora configurato con 57 secondi. Di conseguenza, il router scade a 57 secondi mentre il Il processore/backend sta ancora elaborando la tua richiesta. Questo fa sì che il router risponda con 504 Gateway Timeout errore nell'applicazione client.

Risoluzione

Per configurare il timeout I/O corretto sul router e sul router, procedi nel seguente modo: Processore per risolvere questo problema.

  1. Consulta Best practice per la configurazione del timeout di I/O al fine di comprendere quali valori di timeout deve essere impostato su diversi componenti coinvolti nel flusso di richieste API attraverso Apigee Edge.
  2. Nell'esempio precedente, se ti rendi conto che è necessario impostare un valore di timeout più alto perché il server di backend richiede più tempo e il timeout è stato aumentato del processore di messaggi su 120 secondi, quindi imposta un valore di timeout più alto per esempio: 123 seconds sul router. Per evitare conseguenze su tutti i proxy API A causa del nuovo valore di timeout, imposta il valore di 123 seconds solo sulla un host virtuale specifico usato nel proxy API specifico.
  3. Segui le istruzioni in Configurazione del timeout di I/O sui router per impostare il timeout sull'host virtuale.