Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
Video
Per ulteriori informazioni sugli errori 503, guarda i seguenti video:
| Video | Descrizione |
|---|---|
| Risolvere l'errore 503 - Servizio non disponibile - NoActiveTargets | Scopri di più su:
|
Sintomo
L'applicazione client riceve il codice di stato della risposta HTTP 503 con il messaggio Servizio non disponibile e il codice di errore NoActiveTargets per le richieste del 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
La risposta HTTP 503 Service Unavailable con il codice di errore NoActiveTargets viene in genere osservata quando utilizzi uno o più server di destinazione nella configurazione dell'endpoint di destinazione nel proxy API.
Questo playbook riguarda l'errore 503 Servizio non disponibile con il codice di errore NoActiveTargets causato da errori di controllo di integrità. Per scoprire altre cause di questo errore, consulta questa guida pratica.
Errori del controllo di integrità
Gli errori del controllo di integrità verranno osservati solo se hai configurato un monitor di integrità nell'ambito 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 conteggio degli errori del server.
Se il numero di errori di controllo dell'integrità per il server raggiunge la soglia predefinita (<MaxFailures>),
il processore di messaggi registra il messaggio di avviso nel file di log come mostrato di seguito:
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.
In questo modo puoi capire quale server di destinazione ha raggiunto il conteggio MaxFailure:
- Nome server di destinazione
- Nomi dell'organizzazione e dell'ambiente
- Nome del proxy API
- Nome endpoint di destinazione
Dopodiché, Edge smette di inviare ulteriori richieste a quel server specifico. Una volta che tutti i server di destinazione configurati nella configurazione LoadBalancer raggiungono il conteggio MaxFailure, le successive richieste API rispondono con 503 Servizio non disponibile con il codice di errore NoActiveTargets.
L'utilizzo di Health Monitor consente ad Apigee Edge di includere automaticamente un server di destinazione nella rotazione quando diventa integro, senza dover eseguire nuovamente il deployment del proxy API.
Ecco le possibili cause degli errori del controllo di integrità:
| Causa | Descrizione | Chi può eseguire i passaggi per la risoluzione dei problemi |
|---|---|---|
| Errore di timeout della connessione | Il processore di messaggi non riesce a connettersi al server di destinazione entro il periodo di timeout specificato nella configurazione di LoadBalancer. | Utenti di Edge Private Cloud |
| Richiesta sicura su porta non sicura |
|
Utenti di Edge Private Cloud |
| Richiesta non sicura su porta sicura |
|
Utenti di Edge Private Cloud |
| L'API Health Check risponde con un errore | Se l'API di controllo dell'integrità risponde con un errore o un codice di risposta diverso da quello specificato nell'elemento SuccessResponse del monitor di integrità. | Utenti di Edge Private Cloud |
Passaggi di diagnostica comuni
Determinare l'ID messaggio della richiesta non riuscita
Strumento Traccia
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 degli accessi NGINX
Per determinare l'ID messaggio della richiesta non riuscita utilizzando i log di accesso NGINX:
Puoi anche fare riferimento ai log di accesso NGINX per determinare l'ID messaggio per gli errori 503. Ciò è particolarmente utile se il problema si è verificato in passato o se è intermittente e non riesci ad acquisire la traccia nell'interfaccia utente. Per determinare queste informazioni dai log di accesso NGINX:
- Controlla i log di accesso NGINX: (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log) - Cerca eventuali errori 503 per il proxy API specifico durante un periodo di tempo specifico (se il problema si è verificato in passato) o se alcune richieste continuano a non riuscire con l'errore 503.
- Se sono presenti errori 503 con X-Apigee-fault-code messaging.adaptors.http.flow.NoActiveTargets,
annotare l'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 mentre il processore di messaggi tenta di connettersi al server di backend, nei log del processore di messaggi vengono visualizzati alcuni messaggi di errore comuni. Questi errori vengono registrati dopo il messaggio di eccezione/errore effettivo che ha causato l'errore.
I messaggi di errore comuni osservati nei log del processore di messaggi
(/opt/apigee/var/log/edge-message-processor/logs/system.log) per
503 Service Unavailable con il codice di errore NoActiveTargets
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 la richiesta non è stata inviata al server di backend a causa di un errore. Di conseguenza, il processore di messaggi invia 503 Service Unavailable con il codice di errore NoActiveTargets come risposta al client.
Causa: timeout 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). - 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 questi
messaggi di errore comuni e verifica la presenza di errori HEALTH MONITOR.
Ad esempio, il seguente messaggio di errore HEALTH MONITOR indica che il processore di messaggi non è riuscito con l'errore di timeout della connessione durante l'invio della richiesta API di 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 il numero di volte configurato in Monitoraggio integrità per
MaxFailure, viene visualizzato un messaggio di avviso simile a questo: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 riportate nel messaggio di avviso. Assicurati che il conteggio
MaxFailuresia stato raggiunto per un server di destinazione utilizzato nel proxy API specifico per il quale riscontri il codice di risposta 503 con il codice di errore NoActiveTargets. - Nell'esempio precedente, il controllo di integrità non è riuscito a causa dell'errore
connection timed out. Verifica se riesci a connetterti al server di backend specifico direttamente da ciascuno dei processori di messaggi utilizzando il comandotelnet: - Se riesci a connetterti al server di backend, potresti visualizzare un messaggio come Connesso a backend-server. In questo caso, il problema potrebbe essere temporaneo e potrebbe essersi risolto o essere intermittente. Ripeti il passaggio 4 alcune volte (più di 10 volte) e verifica l'output.
- Se non si verificano errori con il comando
telnet, il problema è risolto. Controlla di nuovo se gli errori del controllo di integrità sono stati risolti. In caso affermativo, non devi fare altro. - Se non riesci a connetterti al server di backend con il comando
telnetin modo intermittente, potrebbe esserci un problema di rete o il server di backend potrebbe essere occupato. - Se non riesci a connetterti al server di backend con il comando
telnetin modo coerente, potrebbe essere perché il traffico non è consentito dai processori di messaggi sul server di backend specifico.
telnet <BackendServer-HostName> 443
Risoluzione
Se l'errore connection timed out viene osservato in modo coerente, assicurati che il server di backend non abbia restrizioni firewall e consenta il traffico dai processori di messaggi Apigee Edge.
Ad esempio, su Linux puoi utilizzare iptables per consentire il traffico dagli
indirizzi IP del processore di messaggi sul server di backend.
Se il problema persiste, collabora con l'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 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 questi
messaggi di errore comuni e verifica la presenza di errori HEALTH MONITOR.
Ad esempio, potresti visualizzare un 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 il
MaxFailurenumero di volte configurato in Monitoraggio integrità, visualizzerai un messaggio di avviso simile al 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 riportate nel messaggio di avviso. Assicurati che il conteggio
MaxFailuresia stato raggiunto per un server di destinazione utilizzato nel proxy API specifico per il quale riscontri il codice di risposta 503 con il codice di errore NoActiveTargets. - Il controllo di integrità non è riuscito e ha generato 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 di questo problema è che è stata effettuata una chiamata sicura (HTTPS) sulla porta non sicura 80.
Questo errore può verificarsi nei seguenti due scenari:
- Server di destinazione sicuro definito con porta non sicura
- Server di destinazione sicuro definito, ma Health Monitor configurato con una porta non sicura
Proteggi la porta non protetta di destinazione
Scenario 1: server di destinazione sicuro definito con porta non sicura
Se hai definito un server di destinazione sicuro, ma con una porta non sicura come la 80, ricevi 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 di Health Monitor per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitoraggio dell'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>nella configurazione del monitoraggio dell'integrità riportata sopra. In questo caso, il processore di messaggi di Edge utilizza la porta specificata nella definizione del server di destinazione (ovvero 80) per effettuare chiamate API di controllo di integrità. - In base alle informazioni riportate sopra, la causa di questo errore è che il server di destinazione è definito come server sicuro (poiché il blocco SSLInfo è abilitato), ma con una porta non sicura 80.
Utilizza l'API Get TargetServer per ottenere la definizione del server di destinazione.
Output della definizione del 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 sicuro, come indicato dal blocco SSLInfo. Tuttavia, è configurato con la porta 80 non sicura.Proteggere la porta HM non sicura di destinazione
Scenario 2: server di destinazione sicuro definito, ma monitoraggio dell'integrità configurato con una porta non sicura
Se hai definito un server di destinazione sicuro, ma il monitoraggio dell'integrità è configurato con una porta non sicura come la 80, 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 l' API Get TargetServer per ottenere la definizione del server di destinazione.
Output della definizione del 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. - Successivamente, controlla la configurazione di Health Monitor per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitoraggio dell'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, il monitor di integrità è configurato con una porta 80 non sicura, come indicato dall'elemento
<Port>. - In base alle informazioni riportate sopra, la causa di questo errore è che il server di destinazione è definito
come server sicuro (poiché il blocco SSLInfo è abilitato) e utilizza la porta sicura 443, ma il monitoraggio dell'integrità
è configurato per eseguire i controlli di integrità con una porta non sicura 80 (specificata nell'elemento
<Port>).ovvero, in questo caso, Edge esegue le API di controllo di integrità come chiamata sicura con la porta non sicura 80 e non riesce a causa dell'errore menzionato in precedenza.
Risoluzione
Proteggi la porta non protetta di destinazione
Scenario 1: server di destinazione sicuro definito con porta non sicura
Per correggere questo errore, aggiorna la definizione del server di destinazione in modo che utilizzi una porta sicura appropriata.
Utilizza l' API Update a TargetServer per aggiornare la definizione del server di destinazione e assicurati che venga utilizzata una porta sicura (ad esempio: 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>
Proteggere la porta HM non sicura di destinazione
Scenario 2: server di destinazione sicuro definito, ma monitoraggio dell'integrità configurato con una porta non sicura
Per correggere questo errore, segui le istruzioni riportate di seguito:
- Modifica la configurazione del monitoraggio dell'integrità in modo da utilizzare una porta sicura (ad esempio: 443) per eseguire i controlli di integrità del server di destinazione nella configurazione dell'endpoint di destinazione del proxy API non riuscito, come mostrato 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 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). - 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 questi
messaggi di errore comuni e verifica la presenza di errori HEALTH MONITOR.
Ad esempio, potresti visualizzare un 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 il
MaxFailurenumero di volte configurato in Monitoraggio integrità, visualizzerai un messaggio di avviso simile al 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 riportate nel messaggio di avviso. Assicurati che il conteggio
MaxFailuresia stato raggiunto per un server di destinazione utilizzato nel proxy API specifico per il quale riscontri il codice di risposta 503 con il codice di errore NoActiveTargets. - Il controllo di integrità non è riuscito e ha generato l'errore:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from serverIl messaggio di errore e l'URL indicano che la causa di questo problema è che è stata effettuata una chiamata non sicura (HTTP) sulla porta sicura 443.
Questo errore può verificarsi nei seguenti due scenari:
- Server di destinazione non sicuro definito con porta sicura
- Server di destinazione non sicuro definito, ma monitor di integrità configurato con una porta sicura
Porta sicura di destinazione non sicura
Scenario 1: server di destinazione non sicuro definito con porta sicura
Se hai definito un server di destinazione non sicuro, ma con una porta sicura come la 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 l' API Get TargetServer per ottenere la definizione del server di destinazione.
Output della definizione del 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 sicuro perché non è presente alcun blocco SSLInfo. Tuttavia, è configurato in modo errato con una porta 443 sicura. - Ora, controlla la configurazione di Health Monitor per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitoraggio dello stato 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 nella configurazione di monitoraggio dell'integrità riportata sopra non è specificato alcun elemento
<Port>. In questo caso, il processore di messaggi di Edge utilizzerà la porta specificata nella definizione del server di destinazione, ovvero la porta 443. - In base alle informazioni riportate sopra, la causa di questo errore è che il server di destinazione è definito
come server non sicuro (poiché il blocco SSLInfo non è definito), ma con una porta sicura 443.
ovvero Edge esegue i controlli di integrità come chiamata non sicura con la porta sicura 443 e non riesce con l'errore menzionato in precedenza.
Porta HM sicura di destinazione non sicura
Scenario 2: server di destinazione non sicuro definito, ma monitoraggio dell'integrità configurato con una porta sicura
Se hai definito un server di destinazione non sicuro, ma il monitoraggio dell'integrità è configurato con una porta sicura come la 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 l' API Get TargetServer per ottenere la definizione del server di destinazione.
Output della definizione del 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è un server non sicuro (in quanto non è presente alcun blocco SSLInfo) configurato con una porta non sicura 80 correttamente. - Successivamente, controlla la configurazione di Health Monitor per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitoraggio dell'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, il monitor di integrità è configurato con la porta 443 sicura, come indicato dall'elemento
<Port>. - In base alle informazioni riportate sopra, la causa di questo errore è che il server di destinazione è definito come
un server non sicuro (poiché il blocco SSLInfo non è definito) con la porta non sicura 80 correttamente,
ma il monitoraggio dello stato di integrità è configurato per eseguire controlli di integrità con una porta sicura 443 (specificata nell'elemento
<Port>).ovvero, in questo caso, Edge esegue i controlli di integrità come chiamata non sicura con la porta sicura 443 e non riesce a causa dell'errore menzionato in precedenza.
Risoluzione
Porta sicura di destinazione non sicura
Scenario 1: server di destinazione non sicuro definito con porta sicura
Per correggere questo errore, aggiorna la definizione del server di destinazione in modo che utilizzi una porta sicura appropriata.
Utilizza l' API Update a Target Server per aggiornare la definizione del server di destinazione e assicurarti che venga utilizzata una porta non sicura (ad esempio: 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 protetta
Scenario 2: server di destinazione non sicuro definito, ma monitoraggio dell'integrità configurato con una porta sicura
Per correggere questo errore, segui le istruzioni riportate di seguito:
- Rimuovi l'elemento
<Port>dalla configurazione del monitor di integrità o modifica la configurazione del monitor di integrità in modo da utilizzare una porta non sicura (ad esempio: 80) per eseguire i controlli di integrità del server di destinazione nella configurazione dell'endpoint di destinazione del proxy API non riuscito, come mostrato 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 al proxy API.
Causa: l'API di controllo dell'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 questi
messaggi di errore comuni e verifica la presenza di errori/avvisi di MONITORAGGIO DELL'INTEGRITÀ.
Ad esempio, potresti visualizzare un avviso di MONITORAGGIO DELLA SALUTE 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 : 404Se questo errore si ripete per il
MaxFailurenumero di volte configurato in Monitoraggio integrità, visualizzerai un messaggio di avviso simile al 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 riportate nel messaggio di avviso. Assicurati che il conteggio
MaxFailuresia stato raggiunto per un server di destinazione utilizzato nel proxy API specifico per il quale riscontri 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 : 404Il messaggio di avviso riportato sopra indica che il codice di risposta previsto per l'API di controllo di integrità era 200, ma la risposta effettiva ricevuta è 404. Pertanto, viene considerato un errore.
- Prima di esaminare la causa della risposta di errore dell'API di controllo di integrità, determina perché Edge
si aspetta che il codice di risposta sia 200 per l'API di controllo di integrità. A questo scopo, controlla la configurazione
del monitoraggio dell'integrità per il server di destinazione nella configurazione dell'endpoint di destinazione:
Configurazione del monitoraggio dell'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 integrità è configurata con il codice di risposta 200 nell'elemento
<SuccessResponse>. Ciò significa che se Edge riceve un codice di risposta (ad esempio 400, 401, 404, 500) diverso da 200 dall'API di controllo di integrità, verrà trattato come un errore e il conteggio degli errori verrà incrementato. - Ora, per esaminare la causa della risposta di errore dell'API per il controllo di integrità, segui questi passaggi:
- Esamina il messaggio precedente al 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/200Prendi nota dell'URL del controllo di integrità da 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/200La risposta alla chiamata precedente restituisce 404, come mostrato 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 e restituisce 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 di controllo di integrità di esempio fornita sopra, il problema si verifica perché è stato utilizzato un URL errato nella configurazione di Health Monitor.
È stato rilevato che l'URL corretto è
https://mocktarget.apigee.net:443/statuscode/200dall'API Mock Target. - Se ricevi un'altra risposta di errore, determina la causa seguendo i passaggi precedenti. Se necessario, collabora con il team di backend.
Risoluzione
- Risolvi il problema relativo all'API di controllo di integrità sul server di backend.
- Per risolvere il problema nell'esempio discusso sopra:
- Modifica l'elemento
<Path>nella configurazione del monitor di integrità in/statuscode/200come mostrato di seguito:<Path>/statuscode/200</Path> - Salva le modifiche nel proxy API.
Se il problema persiste, vai a Must Gather Diagnostic Information.
Diagnostica i problemi utilizzando il monitoraggio delle API
Il monitoraggio delle API ti consente di isolare rapidamente le aree problematiche per diagnosticare errori, problemi di prestazioni e latenza e la loro origine, ad esempio app per sviluppatori, proxy API, target di backend o la piattaforma API.
Esamina uno scenario di esempio
che mostra come risolvere i problemi 5xx con le API utilizzando API Monitoring. Ad esempio,
potresti voler configurare un avviso per ricevere una notifica quando il numero di guasti messaging.adaptors.http.flow.NoActiveTargets
supera una determinata soglia.
Deve raccogliere informazioni diagnostiche
Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli le seguenti informazioni diagnostiche. Contattali e condividili con l'assistenza Apigee:
- Se sei un utente di Public Cloud, fornisci le seguenti informazioni:
- Nome dell'organizzazione
- Nome ambiente
- Nome proxy API
- Comando curl completo per riprodurre l'errore
- File di traccia contenente le richieste con errore 503 Servizio non disponibile con codice di errore NoActiveTargets
- Se sei un utente di Private Cloud, fornisci le seguenti informazioni:
- Messaggio di errore completo osservato
- Nome ambiente
- Bundle proxy API
- File di traccia contenente le richieste con errore 503 Servizio non disponibile con codice di errore NoActiveTargets
- 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)