504 Timeout del gateway - Timeout del router

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

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 dal 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 ricevere 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 > Message Processor > Backend Server, come mostrato nella figura seguente:

Tutti i componenti nel flusso di runtime di Apigee Edge, inclusi client, router, Message Processor e server di backend, sono configurati con valori di timeout predefiniti adatti per garantire che le richieste API non richiedano troppo tempo per essere completate. Se uno dei componenti del flusso non riceve la risposta dal componente upstream entro il periodo di tempo specificato nella configurazione del timeout, il componente specifico andrà in timeout e in genere restituirà un errore 504 Gateway Timeout.

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

Timeout sul router

Il timeout predefinito configurato sui router in Apigee Edge è di 57 secondi. Questo è il tempo massimo che un proxy API può eseguire dal momento in cui la richiesta API viene ricevuta su Edge fino all'invio della risposta, inclusa la risposta del backend e tutte le policy eseguite. Il timeout predefinito può essere sostituito sui router/host virtuali come spiegato in Configurazione del timeout I/O sui router.

Possibili cause

In Edge, le cause tipiche dell'errore 504 Gateway Timeout causato dal timeout del router sono:

Causa Descrizione Istruzioni per la risoluzione dei problemi applicabili a
Configurazione errata del timeout sul router Ciò si verifica se il router è configurato con un periodo di timeout I/O errato. Utenti di Edge Public e Private Cloud

Passaggi di diagnostica comuni

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

  • Monitoraggio delle API
  • Log degli accessi NGINX

Monitoraggio delle API

Per diagnosticare l'errore utilizzando API Monitoring:

  1. Vai alla pagina Analizza > Monitoraggio API > Esamina.
  2. Filtra gli errori 5xx e seleziona l'intervallo di tempo.
  3. Traccia il codice di stato rispetto al tempo.
  4. Fai clic sulla cella specifica che mostra gli errori 504 per visualizzare ulteriori dettagli e i log relativi a questi errori, come mostrato di seguito:

    Esempio che mostra gli errori 504

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

    Nella finestra Log di 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:indica il tempo totale trascorso per la richiesta.

    Nell'esempio riportato sopra,

    • Richiesta rimanda a GET /test-timeout.
    • Il tempo di risposta è di 57.001 secondi. Ciò indica che il router ha raggiunto il timeout prima che il processore di messaggi potesse rispondere, poiché il valore è molto vicino al timeout I/O predefinito impostato sul router, ovvero 57 secondi.

    Puoi anche ottenere tutti i log utilizzando l'API API Monitoring 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 client ha raggiunto il timeout.

    Poiché API Monitoring imposta il proxy su - (non impostato) per questi errori 504, puoi utilizzare l'API (API Logs) per ottenere 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. Esamina il Tempo di risposta per ulteriori errori 504 e verifica se il Tempo di risposta è coerente (valore di timeout I/O impostato sul router pari a 57 secondi) in tutti gli errori 504.

Log degli accessi 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 se sono presenti 504 errori durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste ancora non riuscite con 504.
  3. Tieni presente le seguenti informazioni per alcuni errori 504:
    • Tempo di risposta
    • URI della richiesta

    In questo esempio, vediamo le seguenti informazioni:

    • Request Time: 57.001 secondi. Ciò indica che il router ha raggiunto il timeout dopo 57,001 secondi.

    • Richiesta: GET /test-timeout
    • Alias host: myorg-test.apigee.net
  4. Verifica che l'ora della richiesta corrisponda al timeout I/O configurato sul router/host virtuale. In caso affermativo, significa che il router ha raggiunto il timeout prima che il Message Processor rispondesse entro questo periodo.

    Nell'esempio di voce di log di accesso NGINX mostrato sopra, il Request Time di 57.001 secondi è molto vicino al timeout I/O predefinito impostato sul router. Ciò indica chiaramente che il router ha raggiunto il timeout prima che il Message Processor potesse rispondere.

  5. Determina il proxy API per cui è stata effettuata la richiesta utilizzando il percorso di base nel campo Richiesta .

Causa: configurazione del timeout errata sul router

Diagnosi

  1. Determina se gli errori 504 sono causati dal timeout del router prima che il processore di messaggi possa rispondere. Puoi farlo controllando se il tempo di risposta in API Monitoring/tempo di richiesta nel router (entrambi i campi rappresentano le stesse informazioni,ma hanno nomi diversi) è uguale al timeout I/O configurato sul router/host virtuale e se i campi origine errore, proxy errore e codice errore sono impostati su - utilizzando API Monitoring o i log di accesso NGINX come spiegato in Passaggi di diagnostica comuni.
  2. Verifica se il valore di timeout I/O configurato sul router o sull'host virtuale specifico è inferiore rispetto a quello configurato sul processore di messaggi o sul proxy API specifico.

    Per farlo, segui i passaggi descritti in questa sezione.

Verifica del timeout I/O sugli host virtuali

UI Edge

Per verificare il timeout dell'host virtuale utilizzando l'interfaccia utente Edge:

  1. Accedi alla UI di 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 I/O.
  5. In Proprietà, visualizza il valore di Timeout di lettura proxy in secondi.

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

API di gestione

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

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

    Utente del 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.

    Definizione di host virtuale di esempio

    {
      "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 un valore di 120. Ciò significa che il timeout I/O configurato su questo host virtuale è 120 secondi.

Verifica del timeout I/O nel file router.properties

  1. Accedi a un computer router.
  2. Cerca la proprietà proxy_read_timeout nella directory /opt/nginx/conf.d e controlla 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 nel file di configurazione dell'host virtuale specifico.

    Risultato di esempio 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, nota che la proprietà proxy_read_timeout è stata impostata con il nuovo valore 57 in 0-default.conf, ovvero il file di configurazione per l'host virtuale predefinito. Ciò indica che il timeout I/O è configurato su 57 secondi sul router per l'host virtuale predefinito. Se hai più host virtuali, vedrai queste informazioni per ciascuno di essi. Ottieni il valore di proxy_read_timeout per l'host virtuale specifico che hai utilizzato per effettuare le chiamate API non riuscite con errori 504.

Verifica del timeout I/O nel proxy API

Puoi visualizzare il timeout I/O in:

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

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

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
Visualizza il timeout I/O nella policy ServiceCallout del proxy API
  1. Nell'interfaccia utente Edge, seleziona il proxy API specifico in cui vuoi visualizzare il nuovo valore di timeout I/O per il criterio ServiceCallout.
  2. Seleziona le norme specifiche relative ai callout di servizio che vuoi controllare.
  3. Visualizza l'elemento <Timeout> con un valore appropriato nella configurazione <ServiceCallout>.

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

    <Timeout>120000</Timeout>

Verifica del timeout I/O sui processori di messaggi

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

    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 riportato sopra, nota che la proprietà HTTPTransport.io.timeout.millis è stata impostata con il valore 55000 in http.properties. Ciò indica che il timeout I/O è stato configurato correttamente su 55 secondi sul processore di messaggi.

Dopo aver determinato il timeout configurato sul router e sul processore di messaggi, verifica se il router/host virtuale è stato configurato con un valore di timeout inferiore rispetto a quello del processore di messaggi/proxy API.

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

Timeout sul router (secondi) Timeout sull'host virtuale (secondi) Timeout del 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 verrà utilizzato il valore predefinito di 57 secondi configurato sul router stesso.
  • Sul processore di messaggi è configurato un valore predefinito di 55 secondi.
  • Tuttavia, sul proxy API specifico è configurato un valore di 120 secondi.

Tieni presente che il valore di timeout più alto viene configurato solo sul proxy API, ma il router è ancora configurato con 57 secondi. Pertanto, il router va in timeout dopo 57 secondi mentre il Message Processor/backend sta ancora elaborando la tua richiesta. In questo modo, il router risponde con l'errore 504 Gateway Timeout all'applicazione client.

Risoluzione

Per configurare il timeout I/O corretto sul router e sul processore di messaggi per risolvere il problema, procedi nel seguente modo.

  1. Consulta Best practice per la configurazione del timeout I/O per capire quali valori di timeout devono essere impostati sui diversi componenti coinvolti nel flusso di richieste API tramite Apigee Edge.
  2. Nell'esempio precedente, se determini che è necessario impostare un valore di timeout più elevato perché il server di backend richiede più tempo e hai aumentato il valore di timeout del processore di messaggi a 120 secondi, imposta un valore di timeout più elevato, ad esempio 123 seconds sul router. Per evitare di influire su tutti i proxy API a causa del nuovo valore di timeout, imposta il valore di 123 seconds solo sull' host virtuale specifico utilizzato nel proxy API specifico.
  3. Segui le istruzioni riportate in Configurazione del timeout I/O sui router per impostare il timeout sull'host virtuale.