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:
- Vai alla pagina Analizza > Monitoraggio API > Esamina.
- Filtra gli errori
5xxe seleziona l'intervallo di tempo. - Traccia il codice di stato rispetto al tempo.
-
Fai clic sulla cella specifica che mostra gli errori
504per visualizzare ulteriori dettagli e i log relativi a questi errori, come mostrato di seguito:Esempio che mostra gli errori 504

- 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.001secondi. 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,timeRangeestatus, 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 errori504, 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
- Esamina il Tempo di risposta per ulteriori errori
504e verifica se il Tempo di risposta è coerente (valore di timeout I/O impostato sul router pari a 57 secondi) in tutti gli errori504.
Log degli accessi NGINX
Per diagnosticare l'errore utilizzando i log di accesso NGINX:
- Controlla i log di accesso NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - Cerca se sono presenti
504errori durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste ancora non riuscite con504. - 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.001secondi. Ciò indica che il router ha raggiunto il timeout dopo 57,001 secondi. - Richiesta:
GET /test-timeout - Alias host:
myorg-test.apigee.net
-
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.001secondi è 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. - 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
- Determina se gli errori
504sono 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. -
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:
- Accedi alla UI di Edge.
- Vai ad Amministrazione > Host virtuali.
- Seleziona un ambiente specifico in cui si verifica il problema di timeout.
- Seleziona l'host virtuale specifico per il quale vuoi verificare il valore di timeout I/O.
- 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:
-
Esegui l'API Get virtual host per ottenere la configurazione
virtualhostcome 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
-
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 di120. Ciò significa che il timeout I/O configurato su questo host virtuale è 120 secondi.
Verifica del timeout I/O nel file router.properties
- Accedi a un computer router.
- Cerca la proprietà
proxy_read_timeoutnella directory/opt/nginx/conf.de controlla se è stata impostata con il nuovo valore come segue:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
Controlla il valore impostato per la proprietà
proxy_read_timeoutnel 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 valore57in0-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 diproxy_read_timeoutper l'host virtuale specifico che hai utilizzato per effettuare le chiamate API non riuscite con errori504.
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
- Nell'interfaccia utente Edge, seleziona il proxy API specifico in cui vuoi visualizzare il valore di timeout I/O.
- Seleziona l'endpoint di destinazione specifico che vuoi controllare.
- Visualizza la proprietà
io.timeout.milliscon un valore appropriato nell'elemento<HTTPTargetConnection>nella configurazioneTargetEndpoint.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
- Nell'interfaccia utente Edge, seleziona il proxy API specifico in cui vuoi visualizzare il nuovo valore di timeout I/O per il criterio ServiceCallout.
- Seleziona le norme specifiche relative ai callout di servizio che vuoi controllare.
-
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
- Accedi al computer del processore di messaggi.
-
Cerca la proprietà
HTTPTransport.io.timeout.millisnella directory/opt/apigee/edge-message-processor/confutilizzando 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
- Nell'output di esempio riportato sopra, nota che la proprietà
HTTPTransport.io.timeout.millisè stata impostata con il valore55000inhttp.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.
- 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.
- 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 secondssul router. Per evitare di influire su tutti i proxy API a causa del nuovo valore di timeout, imposta il valore di123 secondssolo sull' host virtuale specifico utilizzato nel proxy API specifico. - Segui le istruzioni riportate in Configurazione del timeout I/O sui router per impostare il timeout sull'host virtuale.