Questa guida descrive come risolvere i problemi di configurazione per i bilanciatori del carico delle applicazioni esterni. Prima di esaminare i problemi, consulta le seguenti pagine:
- Panoramica del bilanciatore del carico delle applicazioni esterno
- Logging e monitoraggio dei bilanciatori del carico delle applicazioni classici e globali
- Logging e monitoraggio del bilanciatore del carico delle applicazioni esterno regionale
Risolvere i problemi comuni di Network Analyzer
Network Analyzer monitora automaticamente la configurazione di rete VPC e rileva sia le configurazioni non ottimali sia le configurazioni errate. Identifica gli errori della rete, fornisce informazioni sulla causa principale e suggerisce possibili soluzioni. Per informazioni sui diversi scenari di configurazione errata rilevati automaticamente da Network Analyzer, consulta Approfondimenti sui bilanciatori del carico nella documentazione di Network Analyzer.
Network Analyzer è disponibile nella console Google Cloud come parte di Network Intelligence Center.
Vai a Network AnalyzerI backend hanno modalità di bilanciamento incompatibili
Quando crei un bilanciatore del carico, potresti visualizzare l'errore:
Validation failed for instance group INSTANCE_GROUP: backend services 1 and 2 point to the same instance group but the backends have incompatible balancing_mode. Values should be the same.
Questo accade quando provi a utilizzare lo stesso backend in due bilanciatori del carico diversi e i backend non hanno modalità di bilanciamento compatibili.
Per ulteriori informazioni, consulta le seguenti risorse:
- Limitazioni e indicazioni per i gruppi di istanze
- Modificare la modalità di bilanciamento di un bilanciatore del carico
Risolvere i problemi di connettività generali
Errori 5XX inspiegabili
Per le condizioni di errore causate da un problema di comunicazione tra il proxy del bilanciatore del carico e i relativi backend, il bilanciatore del carico genera un codice di risposta di errore HTTP (5XX) e lo restituisce al client. Non tutti gli errori HTTP 5XX vengono generati dal bilanciatore del carico. Ad esempio, se un backend invia una risposta HTTP 5XX al bilanciatore del carico, quest'ultimo la inoltra al proprio client. Per determinare se una risposta HTTP 5XX è stata inoltrata da un backend o se è stata generata dal proxy del bilanciatore del carico, fai riferimento al campo statusDetails
dei log del bilanciatore del carico.
Se statusDetails
restituisce una stringa di log response_sent_by_backend
, il bilanciatore del carico sta semplicemente inoltrando il codice di risposta inviato dal backend. In questo caso, devi risolvere i problemi relativi alle risposte di errore HTTP sui tuoi backend.
Per le risposte di errore HTTP con statusDetails
che non corrisponde alla stringa di log
response_sent_by_backend
:
Il bilanciatore del carico delle applicazioni esterno globale e il bilanciatore del carico delle applicazioni esterno regionale generano codici di errore di risposta HTTP significativi come 503 (Servizio non disponibile) e 504 (Timeout gateway).
Il bilanciatore del carico delle applicazioni classico utilizza sempre il codice di errore di risposta HTTP 502.
Le modifiche alla configurazione del bilanciatore del carico delle applicazioni esterno globale, come l'aggiunta o la rimozione di un servizio di backend, possono comportare un breve periodo di tempo in cui gli utenti visualizzano il codice di errore della risposta HTTP 502. Mentre queste modifiche alla configurazione si propagano ai GFEs a livello globale, vedrai le voci di log in cui il campo statusDetails
corrisponde alla stringa di log failed_to_pick_backend
.
Se gli errori HTTP 5XX persistono dopo qualche minuto dal completamento della configurazione del bilanciatore del carico, segui questi passaggi per risolvere i problemi relativi alle risposte HTTP 5XX:
Verifica che sia presente una regola firewall configurata per consentire i controlli di integrità. In assenza di un valore, i log del bilanciatore del carico in genere hanno un valore
statusDetails
corrispondentefailed_to_pick_backend
, che indica che il bilanciatore del carico non è riuscito a scegliere un backend funzionante per gestire la richiesta.Verifica che il traffico del controllo di integrità raggiunga le VM di backend. Per farlo, abilita il logging del controllo di integrità e cerca le voci di log riuscite.
Per i nuovi bilanciatori del carico, la mancanza di voci di log del controllo di integrità riuscite non significa che il traffico del controllo di integrità non raggiunga i backend. Potrebbe significare che lo stato di integrità iniziale del backend non è ancora cambiato da
UNHEALTHY
a uno diverso. Le voci di log del controllo di integrità riuscite sono visibili solo dopo che il prober del controllo di integrità riceve una risposta HTTP 200 OK dal backend.Verifica che il software dei backend sia in esecuzione. Per farlo, controlla se la risposta 5xx viene fornita dal bilanciatore del carico o se viene generata dai backend. Procedi nel seguente modo:
- Utilizza Cloud Logging per visualizzare i log del bilanciatore del carico. Puoi creare una query per cercare solo i codici di risposta 5xx.
Controlla il valore del campo
statusDetails
:- Se
statusDetails
restituisce un messaggio di operazione riuscita, ad esempioresponse_sent_by_backend
, è il backend che fornisce le risposte HTTP 502. Controlla i log nel backend e risolvi i problemi a seconda del servizio in esecuzione nel backend. - Se
statusDetails
restituisce un messaggio di errore, consulta il seguente elenco di soluzioni per alcuni errori comuni correlati alle risposte 5xx:
Messaggio di errore statusDetail Possibili cause e soluzioni failed_to_connect_to_backend
Il bilanciatore del carico non è riuscito a stabilire una connessione con il backend. Ciò potrebbe significare che il servizio in esecuzione sul backend non è in ascolto sulla porta definita nel servizio di backend.
Consigli:
- Imposta la porta del controllo di integrità in modo da utilizzare la porta in uso. Ciò significa che il backend verrà considerato non in stato di salute prima di essere idoneo a gestire il traffico reale.
- Utilizza il seguente comando per assicurarti che sia in esecuzione un servizio sulla porta denominata del servizio di backend:
$ netstat -tnl | grep PORT
failed_to_pick_backend
Il bilanciatore del carico non è riuscito a scegliere un backend. Ciò potrebbe significare che tutti i backend non sono integri. Assicurati di aver configurato le regole firewall corrette per i controlli di integrità.
backend_connection_closed_before_data_sent_to_client
Il backend ha chiuso inaspettatamente la connessione al bilanciatore del carico prima che la risposta venisse proxy al client. Questo può accadere se il bilanciatore del carico invia traffico a un'altra entità. L'altra entità potrebbe essere un bilanciatore del carico di terze parti con un timeout TCP inferiore a quello del bilanciatore del carico. Per maggiori dettagli, vedi Timeout e tentativi di nuovo invio. backend_timeout
Il backend ha impiegato troppo tempo per rispondere. Il timeout del servizio di backend potrebbe essere impostato su un valore troppo basso per consentire al servizio in questione di rispondere. Valuta la possibilità di aumentare il timeout del servizio di backend o di scoprire perché il servizio impiega così tanto tempo a rispondere. - Se
Verifica che il parametro di configurazione keepalive per il software del server HTTP in esecuzione nell'istanza di backend non sia inferiore al timeout keepalive del bilanciatore del carico, il cui valore è fissato a 10 minuti (600 secondi) e non è configurabile.
Il bilanciatore del carico genera un codice di risposta HTTP 5XX quando la connessione al backend si chiude in modo imprevisto durante l'invio della richiesta HTTP o prima che venga ricevuta la risposta HTTP completa. Questo può accadere perché il parametro di configurazione keepalive per il software del server web in esecuzione sull'istanza di backend è inferiore al timeout keepalive fisso del bilanciatore del carico. Assicurati che la configurazione del timeout keepalive per il software del server HTTP su ogni backend sia impostata su un valore leggermente superiore a 10 minuti (il valore consigliato è 620 secondi).
Risolvere gli errori HTTP 408
Con il traffico HTTP, il tempo massimo necessario al client per completare l'invio della richiesta è uguale al timeout del servizio di backend. Se visualizzi risposte 408
HTTP con jsonPayload.statusDetail
client_timed_out
, significa che i progressi non sono stati sufficienti durante il proxy della richiesta del client o della risposta del backend. Se il problema è causato da client che riscontrano problemi di prestazioni, puoi risolverlo aumentando il timeout del servizio di backend.
Il traffico con bilanciamento del carico non ha l'indirizzo di origine del client originale
L'indirizzo IP di origine dei pacchetti, come visto dai backend, non è l'indirizzo IP esterno del bilanciatore del carico. I bilanciatori del carico basati su proxy, come i bilanciatori del carico delle applicazioni esterni, utilizzano due connessioni TCP per trasmettere il traffico dal client ai backend:
- Connessione 1, dal client originale al bilanciatore del carico (subnet GFE o solo proxy)
- Connessione 2, dal bilanciatore del carico (GFE o subnet solo proxy) all'endpoint o alla VM di backend
Gli indirizzi IP di origine e di destinazione per ogni connessione variano in base al tipo di bilanciatore del carico delle applicazioni esterno in uso. Per maggiori dettagli, vedi Indirizzi IP di origine per i pacchetti dei client .
Compare un errore di autorizzazione quando provo a visualizzare un oggetto nel mio bucket Cloud Storage
Per pubblicare oggetti tramite il bilanciamento del carico, gli oggetti Cloud Storage devono essere accessibili pubblicamente. Assicurati di aggiornare le autorizzazioni degli oggetti pubblicati in modo che siano leggibili pubblicamente.
L'URL non pubblica l'oggetto Cloud Storage previsto
L'oggetto Cloud Storage da pubblicare è determinato in base alla mappa URL e all'URL richiesto. Se il percorso della richiesta è mappato a un bucket di backend nella mappa URL, l'oggetto Cloud Storage viene determinato aggiungendo il percorso di richiesta completo al bucket Cloud Storage specificato dalla mappa URL.
Ad esempio, se mappi /static/*
a gs://[EXAMPLE_BUCKET]
, la richiesta a
https://<GCLB IP or Host>/static/path/to/content.jpg
proverà a pubblicare
gs://[EXAMPLE_BUCKET]/static/path/to/content.jpg
. Se l'oggetto non esiste, al suo posto verrà visualizzato il seguente messaggio di errore:
NoSuchKey
The specified key does not exist.
La compressione non funziona
Un bilanciatore del carico delle applicazioni esterno non comprime o decomprime le risposte, ma può pubblicare le risposte generate dal servizio di backend compresse utilizzando strumenti come gzip o DEFLATE.
Se le risposte fornite dal bilanciatore del carico non sono compresse, ma dovrebbero esserlo, accertati che il software del server web in esecuzione sulle tue istanze sia configurato per comprimere le risposte. Per impostazione predefinita, alcuni software per server web disattivano automaticamente la compressione per le richieste che includono un'intestazione Via
, che indica che la richiesta è stata inoltrata da un proxy. Poiché si tratta di un proxy, il bilanciatore del carico delle applicazioni esterno aggiunge un'intestazione Via
a ogni richiesta come richiesto dalla specifica HTTP.
Per attivare la compressione, potrebbe essere necessario eseguire l'override della configurazione predefinita del server web per indicargli di comprimere le risposte anche se la richiesta conteneva un'intestazione Via
.
Per configurare i backend nginx in modo che servano risposte compresse sottoposte a proxy tramite un bilanciatore del carico delle applicazioni esterno:
- Imposta la direttiva
gzip_proxied
in modo appropriato (ad esempio suany
) e - Imposta la direttiva
gzip_vary
suon
.
Per configurare i backend Apache in modo da emettere risposte compresse con proxy tramite un bilanciatore del carico delle applicazioni esterno:
- Utilizza il filtro
DEFLATE
e - Aggiungi
Vary Accept-Encoding
all'intestazione della risposta utilizzando il modulomod_headers
.
Risolvere i problemi relativi ai backend in stato non integro
Risolvere i problemi relativi a HTTP/2 per i backend
Assicurati che l'istanza di backend sia in stato attivo e supporti il protocollo HTTP/2. Puoi verificarlo testando la connettività all'istanza di backend utilizzando HTTP/2. Assicurati che la VM utilizzi le suite di crittografia conformi alle specifiche HTTP/2. Ad esempio, determinate suite di crittografia TLS 1.2 non sono consentite da HTTP/2. Consulta la lista nera delle suite di crittografia TLS 1.2.
Dopo aver verificato che la VM utilizzi il protocollo HTTP/2, assicurati che la configurazione del firewall consenta il passaggio del controllo di integrità e del bilanciatore del carico.
Se non ci sono problemi con la configurazione del firewall, assicurati che il bilanciatore del carico sia configurato per comunicare con la porta corretta sulla VM.
Risolvere i problemi relativi al backend esterno e al NEG internet
Prima di esaminare i problemi, consulta le seguenti pagine:
- Panoramica dei NEG internet
- Configura un bilanciatore del carico delle applicazioni esterno globale con un backend esterno (NEG internet)
- Configura un bilanciatore del carico delle applicazioni esterno regionale con un backend esterno (NEG internet)
Il traffico non raggiunge gli endpoint
Dopo aver configurato un servizio, il nuovo endpoint diventa raggiungibile tramite il bilanciatore del carico delle applicazioni esterno quando:
- L'endpoint è collegato al NEG internet.
- L'FQDN associato può essere risolto tramite DNS (se utilizzi il tipo di endpoint FQDN).
- L'endpoint è accessibile tramite internet.
Se il traffico non riesce a raggiungere l'endpoint, generando un codice di errore 502, esegui una query sul record TXT DNS _cloud-eoips.googleusercontent.com
utilizzando uno strumento come dig o nslookup. Prendi nota dei CIDR (che seguono ip4:
) e assicurati che questi intervalli siano consentiti dal firewall o dall'elenco di controllo dell'accesso (ACL) cloud.
Dopo aver configurato un backend esterno, le richieste al backend esterno non sono andate a buon fine con un errore 5xx
- Seleziona Logging.
- Verifica che il gruppo di endpoint di rete sia configurato con l'IP:porta o FQDN:porta corretto per il tuo backend esterno.
- Se utilizzi un FQDN, assicurati che sia risolvibile tramite Google Public DNS. Puoi verificare che l'FQDN sia risolvibile tramite Google Public DNS seguendo questi passaggi o direttamente tramite l'interfaccia web.
- Se accedi al bilanciatore del carico solo tramite il suo IP esterno e il tuo web server di origine si aspetta un nome host, assicurati di inviare un'intestazione Host HTTP valida al tuo backend configurando un'intestazione di richiesta personalizzata.
- Se comunichi con un backend tramite HTTPS o HTTP2 (come impostato nel
protocol
campo del servizio di backend) configurato comeINTERNET_FQDN_PORT
endpoint di backend esterno, assicurati che l'origine sia in grado di presentare un certificato TLS (SSL) valido e che il FQDN configurato corrisponda a un SAN (Subject Alternative Name) nell'elenco diprotocol
SAN dei certificati. Un certificato valido è definito come un certificato firmato da un'autorità di certificazione pubblica e che non è scaduto. - Quando utilizzi endpoint di backend esterni
INTERNET_FQDN_PORT
, i certificati autofirmati non sono accettati dal bilanciatore del carico e vengono rifiutati. - Quando utilizzi HTTPS o HTTP/2 con endpoint di tipo
INTERNET_IP_PORT
, non viene eseguito alcun controllo di convalida/SAN del certificato SSL. Ciò significa che è possibile utilizzare certificati autofirmati. Quando utilizzi SSL, ti consigliamo di utilizzare gli endpointINTERNET_FQDN_PORT
per assicurarti che i certificati del server e i SAN possano essere convalidati.
Le risposte del mio backend esterno non vengono memorizzate nella cache da Cloud CDN
Assicurati che:
- Hai attivato Cloud CDN sul servizio di backend contenente il NEG che punta al tuo backend esterno impostando enableCDN su true.
- Le risposte fornite dal tuo backend esterno soddisfano i requisiti di memorizzazione nella cache di Cloud CDN. Ad esempio, stai inviando intestazioni di risposta
Cache-Control: public, max-age=3600
dall'origine.
Risolvere i problemi relativi ai NEG serverless
Prima di esaminare i problemi, consulta le seguenti pagine:
- Panoramica delle NEG serverless
- Configura un bilanciatore del carico delle applicazioni esterno globale con NEG serverless
Le richieste non riescono con un errore 404
Assicurati che la risorsa serverless sottostante (ad esempio un servizio App Engine, Cloud Run o Cloud Functions) sia ancora in esecuzione. Se la risorsa serverless viene eliminata, ma il NEG serverless esiste ancora, il bilanciatore del carico delle applicazioni esterno continuerà a tentare di inoltrare le richieste al servizio inesistente. Il risultato è una risposta 404.
In generale, un bilanciatore del carico delle applicazioni esterno non può rilevare se la risorsa serverless di base funziona come previsto. Ciò significa che se il servizio in una regione restituisce errori, ma l'infrastruttura complessiva di Cloud Run, delle funzioni Cloud Run o di App Engine in quella regione è in funzione normale, il bilanciatore del carico delle applicazioni esterno non reindirizzerà automaticamente il traffico in altre regioni. Assicurati di testare attentamente le nuove versioni dei tuoi servizi prima di inoltrare il traffico degli utenti.
Gestione delle mancate corrispondenze delle maschere URL
Se l'applicazione della maschera URL configurata all'URL della richiesta dell'utente non genera un nome di servizio o se genera un nome di servizio non esistente, il bilanciatore del carico potrebbe gestire queste mancate corrispondenze in modo diverso a seconda della piattaforma di calcolo serverless in uso.
Cloud Run: in caso di mancata corrispondenza della maschera dell'URL, il bilanciatore del carico restituisce un errore HTTP 404 (Pagina non trovata).
Funzioni Cloud Run: in caso di mancata corrispondenza della maschera URL, il bilanciatore del carico restituisce un errore HTTP 404 (Pagina non trovata).
App Engine: in caso di mancata corrispondenza della maschera URL, App Engine utilizza dispatch.yaml
e la logica di routing predefinita di App Engine per determinare a quale servizio inviare la richiesta.