Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione
Documentazione di Apigee X. Informazioni
Video
Per ulteriori informazioni sugli errori 503, guarda i seguenti video:
Video | Descrizione |
---|---|
Risolvere i problemi relativi al servizio 503 non disponibile - NoActiveTarget | Scopri di più su quanto segue:
|
Sintomo
L'applicazione client riceve il codice di stato della risposta HTTP 503 con la il messaggio Servizio non disponibile e il codice di errore NoActiveTarget per le richieste proxy API.
Messaggio di errore
Verrà visualizzata la seguente risposta di errore:
HTTP/1.1 503 Service Unavailable
Nella risposta HTTP viene visualizzato il seguente messaggio di errore:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.NoActiveTargets" } } }
Possibili cause
In genere viene osservata la risposta HTTP 503 Service Unavailable con il codice di errore NoActiveTarget. quando utilizzi uno o più server di destinazione nella configurazione dell'endpoint di destinazione del proxy API.
Questa guida pratica riguarda il servizio 503 non disponibile con il codice di errore NoActiveTargets provocati da errori del controllo di integrità. Consulta questa guida pratica per conoscere altre cause di questo errore.
Errori del controllo di integrità
Gli errori del controllo di integrità verranno osservati solo se è stata configurata una Monitoraggio di integrità come parte della configurazione del bilanciamento del carico del server di destinazione nell'endpoint di destinazione del proxy API.
Quando un server di destinazione non supera un controllo di integrità, Edge incrementa il numero di errori del server.
Se il numero di errori del controllo di integrità per il server raggiunge la soglia predefinita (<MaxFailures>
),
L'elaboratore di messaggi registra il messaggio di avviso come mostrato di seguito nel proprio file di log:
Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
Il messaggio di avviso fornisce le seguenti informazioni.
Questo ti aiuta a capire quale server di destinazione ha raggiunto il numero di MaxFailure
:
- Nome server di destinazione
- Nomi di organizzazioni e ambienti
- Nome proxy API
- Nome endpoint di destinazione
Dopodiché, Edge smette di inviare ulteriori richieste a quel server specifico. Una volta che tutti i target
i server configurati nella configurazione LoadBalancer raggiungono il conteggio di MaxFailure
, le successive
Le richieste API ricevono una risposta con 503 Service Unavailable con il codice di errore NoActiveTarget.
L'utilizzo di Monitoraggio di integrità consente ad Apigee Edge di includere automaticamente un server di destinazione la rotazione quando diventa integro, senza dover eseguire nuovamente il deployment del proxy API.
Di seguito sono riportate le possibili cause degli errori nel controllo di integrità:
Causa | Descrizione | Chi può eseguire la procedura di risoluzione dei problemi |
---|---|---|
Errore di timeout della connessione | Il processore di messaggi non è in grado di connettersi al server di destinazione entro il timeout specificato nella configurazione LoadBalancer. | Utenti Edge Private Cloud |
Richiesta sicura su porta non sicura |
|
Utenti Edge Private Cloud |
Richiesta non sicura su porta sicura |
|
Utenti Edge Private Cloud |
L'API Health Check risponde con un errore | Se l'API per il controllo di integrità risponde con un errore o un codice di risposta, qualsiasi cosa diversa da specificato nell'elemento SuccessResponse di Health Monitor. | Utenti Edge Private Cloud |
Passaggi diagnostici comuni
Determinare l'ID messaggio della richiesta non riuscita
Strumento Trace
Per determinare l'ID messaggio della richiesta non riuscita utilizzando lo strumento Trace:
- Attiva la sessione di traccia, effettua la chiamata API e riproduci il problema: 503 Service Unavailable con il codice di errore NoActiveTargets.
- Seleziona una delle richieste non riuscite.
- Vai alla fase AX e determina l'ID messaggio (
X-Apigee.Message-ID
) della richiesta scorrendo verso il basso nella sezione Dettagli fase come mostrato nella figura seguente.
Log di accesso NGINX
Per determinare l'ID messaggio della richiesta non riuscita utilizzando i log di accesso NGINX:
Puoi inoltre fare riferimento ai log di accesso NGINX per determinare l'ID messaggio degli errori 503. Ciò è particolarmente utile se il problema si è verificato in passato o se il problema è intermittente e non riesci ad acquisire la traccia nell'interfaccia utente. Segui questi passaggi per determinare queste informazioni dai log di accesso di NGINX:
- Controlla i log di accesso NGINX: (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log
) - Cerca se sono presenti errori 503 per il proxy API specifico durante un periodo di tempo specifico (se il problema si è verificato in passato) o se sono presenti richieste che non vanno ancora a buon fine con 503.
- Se si verificano errori 503 con X-Apigee-fault-code Messaging.adaptors.http.flow.NoActiveTargets,
Prendi nota dell'ID messaggio per una o più richieste di questo tipo, come mostrato nell'esempio seguente:
Voce di esempio che mostra l'errore 503
Messaggi di errore comuni
Quando vengono utilizzati i server di destinazione e si verifica un errore durante il tentativo dell'elaboratore di messaggi per connetterti al server di backend, vedrai alcuni messaggi di errore comuni nella Log del processore di messaggi. Questi errori vengono registrati dopo l'effettivo messaggio di errore/eccezione che ha portato all'errore.
Messaggi di errore comuni osservati nei log del processore di messaggi
(/opt/apigee/var/log/edge-message-processor/logs/system.log
) per
503 Servizio non disponibile con il codice di errore NoActiveTarget
sono i seguenti:
org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 INFO ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Failed to send request to target servers : [demo-target] for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : No Active Target server Found for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Unexpected error while sending request com.apigee.errors.http.server.ServiceUnavailableException: The Service is temporarily unavailable at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.sendRequest(LBTargetRequestSender.java:299) at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.access$400(LBTargetRequestSender.java:57) …<snipped>
Questi messaggi di errore indicano che non è stato possibile inviare la richiesta al server di backend a causa di un errore. Di conseguenza, il processore di messaggi invia un messaggio 503 Service Unavailable con il codice di errore NoActiveTargets come risposta al client.
Causa: timeout della connessione
Diagnosi
- Determina l'ID messaggio della richiesta non riuscita.
- Cerca l'ID messaggio nel log del processore di messaggi (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Vedrai l'icona
messaggi di errore comuni corrispondenti all'ID messaggio. Tuttavia,
per scoprire la causa effettiva degli errori del controllo di integrità, scorri sopra queste
messaggi di errore comuni e verifica la presenza di eventuali errori HEALTH MONITOR.
Ad esempio, il seguente messaggio di errore HEALTH MONITOR indica che il processore di messaggi non ha funzionato con errore di timeout della connessione durante l'invio della richiesta API per il controllo di integrità:
Apigee-Timer-6 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://<BackendServer-Hostname>:443/status java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) …<snipped>
Se questo errore si ripete per
MaxFailure
numero di volte configurato nel Monitoraggio salute, viene visualizzato un messaggio di avviso simile al seguente:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
Leggi attentamente le informazioni contenute nel messaggio di avviso. Assicurati che
MaxFailure
per un server di destinazione usato nello specifico proxy API per il quale venga visualizzato il codice di risposta 503 con il codice di errore NoActiveTargets. - Nell'esempio precedente, il controllo di integrità non è riuscito e ha generato l'errore
connection timed out
. Verifica se riesci a connetterti al server di backend specifico direttamente da ciascun server Processori di messaggi che utilizzano il comandotelnet
: - Se riesci a connetterti al server di backend, potresti visualizzare un messaggio simile a Connesso a backend-server. Potrebbe trattarsi di un problema temporaneo e potrebbe essere stato risolto o si tratta di un problema intermittente. Ripeti il passaggio 4 alcune volte (almeno 10 volte) e verifica l'output.
- Se non ci sono costantemente errori con il comando
telnet
, il problema è risolto. Ricontrolla se gli errori del controllo di integrità sono stati interrotti. Se sì, non dovrai farlo altro ancora. - Se non riesci a connetterti al server di backend con il comando
telnet
a intermittenza: è possibile che ci sia un problema di rete o che il tuo server di backend sia occupato. - Se non riesci a connetterti al server di backend in modo coerente con il comando
telnet
: il traffico potrebbe non essere consentito dai processori di messaggi sullo specifico server di backend.
telnet <BackendServer-HostName> 443
Risoluzione
Se l'errore connection timed out
viene osservato costantemente, assicurati che il backend
server non ha limitazioni firewall e consente il traffico dai processori di messaggi Apigee Edge.
Ad esempio, su Linux, potresti utilizzare iptables per consentire il traffico proveniente
Indirizzi IP del processore di messaggi sul server di backend.
Se il problema persiste, rivolgiti all'amministratore di rete per determinare e risolvere il problema. Se hai bisogno di ulteriore assistenza da parte di Apigee, contatta l'assistenza Apigee.
Causa: richiesta sicura su una porta non sicura
Diagnosi
- Determina l'ID messaggio della richiesta non riuscita.
- Cerca l'ID messaggio nel log del processore di messaggi (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Verranno visualizzati i messaggi di errore comuni corrispondenti all'ID messaggio.
Tuttavia, per conoscere la causa effettiva degli errori del controllo di integrità, scorri sopra queste
messaggi di errore comuni e verifica la presenza di eventuali errori HEALTH MONITOR.
Ad esempio, potresti visualizzare l'errore HEALTH MONITOR come mostrato di seguito:
Apigee-Timer-1 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://mocktarget.apigee.net:80/status javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710) at sun.security.ssl.InputRecord.read(InputRecord.java:527) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397) …<snipped>
Se questo errore si ripete per
MaxFailure
numero di volte la configurazione nel Monitoraggio salute, viene visualizzato un messaggio di avviso come il seguente:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
Leggi attentamente le informazioni contenute nel messaggio di avviso. Assicurati che
MaxFailure
per un server di destinazione usato nello specifico proxy API per il quale viene visualizzato il codice di risposta 503 con il codice di errore NoActiveTargets. - Il controllo di integrità non è riuscito e si è verificato l'errore:
Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Il messaggio di errore e l'URL indicano che la causa del problema è che chiamata sicura (HTTPS) è stata effettuata sulla porta non sicura 80.
Questo errore può verificarsi nei due seguenti scenari:
- Server di destinazione sicuro definito con una porta non sicura
- Server di destinazione sicuro definito, ma Monitoraggio integrità configurato con una porta non sicura
Porta non sicura di destinazione
Scenario 1: server di destinazione sicuro definito con una porta non sicura
Se avete definito un server di destinazione sicuro, ma con una porta non sicura come 80, questo errore. Per verificare se questa è la causa del problema, procedi nel seguente modo:
- Controlla la definizione del server di destinazione utilizzato nella configurazione dell'endpoint di destinazione.
- Ora controlla la configurazione del Monitoraggio di integrità del server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitor di integrità
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
Tieni presente che non è specificato alcun elemento
<Port>
nel Configurazione di Monitoraggio di integrità qui sopra. In questo caso, il processore di messaggi di Edge utilizza la porta specificato nella definizione del server di destinazione (che è 80) per effettuare chiamate API per il controllo di integrità. - In base alle informazioni precedenti, questo errore è dovuto al fatto che il server di destinazione definito come un server sicuro (perché è abilitato il blocco SSLInfo), ma con una porta non sicura 80.
Utilizza la Recupera l'API TargetServer per ottenere la definizione del server di destinazione.
Output definizione server di destinazione
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
Nell'esempio precedente, la definizione mostra che il server di destinazione
mocktarget
è un server come indicato dal blocco SSLInfo. Tuttavia, è configurata con una porta 80 non sicura.Porta HM non sicura di destinazione
Scenario 2: è stato definito un server di destinazione sicuro, ma Monitoraggio di integrità configurato con una porta non sicura
Se hai definito un server di destinazione sicuro, ma il Monitoraggio di integrità è configurato con un come porta non sicura, come 80, viene visualizzato questo errore. Per eseguire la verifica, procedi nel seguente modo Se questa è la causa del problema:
- Controlla la definizione del server di destinazione utilizzato nella configurazione dell'endpoint di destinazione.
Utilizza la Ottieni l'API TargetServer per ottenere la definizione del server di destinazione.
Output definizione server di destinazione
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
Nell'esempio precedente, la definizione mostra che il server di destinazione
mocktarget
è un server sicuro, come indicato dal blocco SSLInfo. - Quindi, controlla la configurazione del Monitoraggio di integrità del server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitor di integrità
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor>
Nell'esempio precedente, Health Monitor è configurato con una porta 80 non sicura, come indicato dall'elemento
<Port>
. - In base alle informazioni riportate sopra, questo errore è dovuto al fatto che il server di destinazione è definito
Come server sicuro (poiché il blocco SSLInfo è abilitato) e utilizza la porta protetta 443, ma la funzionalità Monitoraggio Salute
è configurata per eseguire controlli di integrità con una porta non sicura 80 (specificata nell'elemento
<Port>
).In questo caso, Edge rende le API di controllo di integrità come una chiamata sicura porta 80 e restituisce l'errore riportato sopra.
Risoluzione
Porta non sicura di destinazione
Scenario 1: server di destinazione sicuro definito con una porta non sicura
Per correggere questo errore, aggiorna la definizione del server di destinazione in modo che utilizzi una porta protetta adeguata.
Utilizza la Aggiorna un'API TargetServer per aggiornare la definizione del server di destinazione e assicurarti che Viene utilizzata una porta sicura (ad es. 443) come mostrato nell'esempio seguente:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
Porta HM non sicura di destinazione
Scenario 2: è stato definito un server di destinazione sicuro, ma Monitoraggio di integrità configurato con una porta non sicura
Per correggere questo errore, procedi nel seguente modo:
- Modifica la configurazione di Monitoraggio di integrità in modo che utilizzi una porta sicura (ad esempio: 443) per eseguire la destinazione
controlli di integrità del server nella configurazione dell'endpoint di destinazione del proxy API con errore, come illustrato di seguito:
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
- Salva le modifiche apportate al proxy API.
Causa: richiesta non sicura su una porta sicura
Diagnosi
- Determina l'ID messaggio della richiesta non riuscita.
- Cerca l'ID messaggio nel log del processore di messaggi (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Vedrai l'icona
messaggi di errore comuni corrispondenti all'ID messaggio.
Tuttavia, per conoscere la causa effettiva degli errori del controllo di integrità, scorri sopra queste
messaggi di errore comuni e verifica la presenza di eventuali errori HEALTH MONITOR.
Ad esempio, potresti visualizzare l'errore HEALTH MONITOR come mostrato di seguito:
Apigee-Timer-2 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) …<snipped>
Se questo errore si ripete per
MaxFailure
numero di volte la configurazione nel Monitoraggio salute, viene visualizzato un messaggio di avviso come il seguente:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
Leggi attentamente le informazioni contenute nel messaggio di avviso. Assicurati che
MaxFailure
per un server di destinazione usato nello specifico proxy API per il quale viene visualizzato il codice di risposta 503 con il codice di errore NoActiveTargets. - Il controllo di integrità non è riuscito e si è verificato l'errore:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server
Il messaggio di errore e l'URL indicano che la causa del problema è che la chiamata non sicura (HTTP) è stata effettuata sulla porta protetta 443.
Questo errore può verificarsi nei due seguenti scenari:
- Server di destinazione non sicuro definito con porta sicura
- Server di destinazione non sicuro definito, ma Monitoraggio integrità configurato con una porta sicura
Porta sicura di destinazione non sicura
Scenario 1: server di destinazione non sicuro definito con una porta sicura
Se hai definito un server di destinazione non sicuro ma con una porta sicura come 443, viene visualizzato questo errore. Per verificare se questa è la causa del problema, procedi nel seguente modo:
- Controlla la definizione del server di destinazione utilizzato nella configurazione dell'endpoint di destinazione.
Utilizza la Ottieni l'API TargetServer per ottenere la definizione del server di destinazione.
Output definizione server di destinazione
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>
Nell'esempio precedente, la definizione mostra che il server di destinazione
mocktarget
è un server non protetto in quanto non esiste un blocco SSLInfo. Tuttavia, non è corretto configurato con una porta 443 sicura. - Ora controlla la configurazione del Monitoraggio di integrità del server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitor di integrità
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
Tieni presente che non è specificato alcun elemento
<Port>
in Monitoraggio salute configurazione precedente. In questo caso, il processore di messaggi di Edge utilizzerà la porta specificata la definizione del server di destinazione, che è 443. - In base alle informazioni riportate sopra, questo errore è dovuto al fatto che il server di destinazione è definito
Come server non protetto (poiché il blocco SSLInfo non è definito), ma con una porta 443 protetta.
In altre parole, Edge effettua i controlli di integrità come una chiamata non sicura con la porta sicura 443 e non va a buon fine con l'errore indicato sopra.
Porta HM sicura di destinazione non sicura
Scenario 2: server di destinazione non sicuro definito, ma Monitoraggio integrità configurato con una porta sicura
Se hai definito un server di destinazione non sicuro ma il monitoraggio dello stato di integrità è configurato con una porta sicura come 443, viene visualizzato questo errore. Per verificare se questa è la causa del problema, procedi nel seguente modo:
- Controlla la definizione del server di destinazione utilizzato nella configurazione dell'endpoint di destinazione.
Utilizza la Ottieni l'API TargetServer per ottenere la definizione del server di destinazione.
Output definizione server di destinazione
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
Nell'esempio precedente, la definizione mostra che il server di destinazione
mocktarget
non è sicuro (in quanto non è presente un blocco SSLInfo) configurato correttamente con una porta 80 non sicura. - Quindi, controlla la configurazione del Monitoraggio di integrità del server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitor di integrità
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
Nell'esempio precedente, Health Monitor è configurato con una porta 443 sicura, come indicato dall'elemento
<Port>
. - In base alle informazioni riportate sopra, questo errore è dovuto al fatto che il server di destinazione è definito come
Un server non protetto (dal momento che il blocco SSLInfo non è definito) con correttamente la porta 80 non protetta;
ma Monitoraggio di integrità è configurato per eseguire controlli di integrità con una porta sicura 443 (specificata nell'elemento
<Port>
).In questo caso, Edge esegue i controlli di integrità come chiamate non sicure con la porta sicura 443 e non va a buon fine con il suddetto errore.
Risoluzione
Porta sicura di destinazione non sicura
Scenario 1: server di destinazione non sicuro definito con una porta sicura
Per correggere questo errore, aggiorna la definizione del server di destinazione in modo che utilizzi una porta protetta adeguata.
Utilizza la Aggiorna un'API Target Server per aggiornare la definizione del server di destinazione e assicurarti che viene utilizzata una porta non sicura (ad es. 80), come mostrato nell'esempio seguente:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
Porta HM sicura di destinazione non sicura
Scenario 2: server di destinazione non sicuro definito, ma Monitoraggio integrità configurato con una porta sicura
Per correggere questo errore, procedi nel seguente modo:
- Rimuovi l'elemento
<Port>
dalla configurazione di Monitoraggio di integrità o modificare la configurazione di Monitoraggio Salute in modo che utilizzi una porta non sicura (ad esempio 80) eseguire i controlli di integrità del server di destinazione nella configurazione dell'endpoint di destinazione del proxy API con errori, come illustrato di seguito:<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
- Salva le modifiche apportate al proxy API.
Causa: l'API per il controllo di integrità risponde con un errore
Diagnosi
- Determina l'ID messaggio della richiesta non riuscita.
- Cerca l'ID messaggio nel log del processore di messaggi (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - Verranno visualizzati i messaggi di errore comuni corrispondenti all'ID messaggio.
Tuttavia, per conoscere la causa effettiva degli errori del controllo di integrità, scorri sopra queste
messaggi di errore comuni e verifica la presenza di errori/avvisi relativi a HEALTH MONITOR.
Ad esempio, potresti visualizzare l'avviso HEALTH MONITOR come mostrato di seguito:
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200 Apigee-Timer-7 WARN SERVICES.HEALTH_MONITOR - HTTPMonitor.monitor() : HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
Se questo errore si ripete per
MaxFailure
numero di volte la configurazione nel Monitoraggio salute, viene visualizzato un messaggio di avviso come il seguente:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
Leggi attentamente le informazioni contenute nel messaggio di avviso. Assicurati che
MaxFailure
per un server di destinazione usato nello specifico proxy API per il quale viene visualizzato il codice di risposta 503 con il codice di errore NoActiveTargets. - Il controllo di integrità ha restituito il messaggio di avviso:
HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
Il messaggio di avviso riportato sopra indica che il codice di risposta previsto per l'API per il controllo di integrità era 200. ma la risposta effettiva ricevuta è 404. Pertanto, viene considerato un errore.
- Prima di indagare sulla causa della risposta di errore da parte dell'API per il controllo di integrità, determina perché Edge
prevede che il codice di risposta per l'API per il controllo di integrità sia 200. Per farlo, controlla il Monitoraggio del Salute
per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitor di integrità
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/status/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
Tieni presente che la configurazione di Monitoraggio di integrità è configurata con il codice di risposta 200 nell'elemento
<SuccessResponse>
. Ciò significa che se Edge riceve un qualsiasi codice di risposta (ad esempio 400, 401, 404, 500) diverso da 200 dall'API per il controllo di integrità, verrà trattata come un errore e il conteggio degli errori verrà incrementato. - Ora, per esaminare la causa della risposta di errore dall'API per il controllo di integrità, segui questi passaggi:
- Esamina il messaggio prima del messaggio di avviso nel log del processore di messaggi.
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
Prendi nota dell'URL del controllo di integrità contenuto in questo messaggio.
- Puoi effettuare una chiamata diretta a questo URL dal processore di messaggi e controllare la risposta effettiva
curl -i https://mocktarget.apigee.net:443/status/200
La risposta alla chiamata precedente restituisce un errore 404, come indicato nei log del processore di messaggi:
< HTTP/2 404
- Ciò dimostra che anche la chiamata diretta all'URL del controllo di integrità non va a buon fine con lo stesso codice di risposta 404. Ciò significa che l'URL del controllo di integrità potrebbe non essere corretto o che la risorsa a cui si accede come parte dell'URL non è più disponibile.
- Nell'API per il controllo di integrità di esempio fornita sopra, il problema si verifica perché nella configurazione di Monitoraggio di integrità è stato utilizzato un URL errato.
È stato rilevato che l'URL corretto è
https://mocktarget.apigee.net:443/statuscode/200
da API Mock Target. - Se ricevi un'altra risposta di errore, determina la causa seguendo le passaggi precedenti. Se necessario, collabora con il team di backend.
Risoluzione
- Risolvi il problema relativo all'API per il controllo di integrità sul tuo server di backend.
- Per risolvere il problema nell'esempio discusso sopra:
- Modifica l'elemento
<Path>
nella configurazione di Health Monitor in/statuscode/200
come mostrato di seguito:<Path>/statuscode/200</Path>
- Salva le modifiche nel proxy API.
Se il problema persiste, vai a Raccogliere informazioni diagnostiche.
Diagnosi dei problemi utilizzando il monitoraggio delle API
Il monitoraggio delle API ti consente di isolare le aree in modo da diagnosticare rapidamente i problemi di errore, prestazioni e latenza e la loro origine, come come le app, i proxy API, i target di backend o la piattaforma API.
Presentazione di uno scenario di esempio
che illustra come risolvere i problemi 5xx relativi alle API utilizzando il monitoraggio delle API. Ad esempio:
ti consigliamo di impostare un avviso per ricevere una notifica quando il numero di messaging.adaptors.http.flow.NoActiveTargets
di errore superano una determinata soglia.
Raccogliere dati diagnostici
Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli i seguenti dati informazioni diagnostiche. Contatta e condividili con l'assistenza Apigee:
- Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:
- Nome dell'organizzazione
- Nome ambiente
- Nome proxy API
- Completa il comando curl per riprodurre l'errore
- File di traccia contenente le richieste con servizio 503 non disponibile con codice di errore NoActiveTarget
- Se sei un utente del cloud privato, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato
- Nome ambiente
- Bundle proxy API
- File di traccia contenente le richieste con servizio 503 non disponibile con codice di errore NoActiveTarget
- Log di accesso NGINX
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log
) - Log del processore di messaggi
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)