Risolvere i problemi relativi ai bilanciatori del carico delle applicazioni esterni

Questa guida descrive come risolvere i problemi di configurazione per i bilanciatori del carico delle applicazioni esterni. Prima di esaminare i problemi, acquisisci familiarità con le seguenti pagine:

Risolvere i problemi comuni di Network Analyzer

Network Analyzer monitora automaticamente la configurazione di rete VPC e rileva sia le configurazioni non ottimali sia quelle errate. Identifica gli errori di rete, fornisce informazioni sulla causa principale e suggerisce possibili soluzioni. Per scoprire i diversi scenari di configurazione errata rilevati automaticamente da Network Analyzer, consulta Approfondimenti sul bilanciatore del carico nella documentazione di Network Analyzer.

Network Analyzer è disponibile nella console Google Cloud come parte di Network Intelligence Center.

Vai a Network Analyzer

I 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.

Ciò si verifica quando tenti di 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:

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 inoltra la risposta al client. Per determinare se una risposta HTTP 5XX è stata inoltrata da un backend o se è stata generata dal proxy del bilanciatore del carico, consulta il campo statusDetails dei log del bilanciatore del carico.

Se statusDetails restituisce una stringa di log response_sent_by_backend, il bilanciatore del carico si limita a inoltrare il codice di risposta inviato dal backend, nel qual caso devi risolvere i problemi relativi alle risposte di errore HTTP sui 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 della 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 GFE a livello globale, vedrai 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:

  1. Verifica che esista una regola firewall configurata per consentire i controlli di integrità. In assenza di uno, i log del bilanciatore del carico in genere hanno un statusDetails corrispondente failed_to_pick_backend, il che indica che il bilanciatore del carico non è riuscito a selezionare un backend integro per gestire la richiesta.

  2. 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.

  3. Verifica che il software sui backend sia in esecuzione. Per farlo, controlla se la risposta 5xx viene fornita dal bilanciatore del carico o se è generata dai backend. Segui questi passaggi:

    1. Utilizza Cloud Logging per visualizzare i log del bilanciatore del carico. Puoi creare una query per cercare solo i codici di risposta 5xx.
    2. Controlla il valore del campo statusDetails:

      • Se statusDetails restituisce un messaggio di operazione riuscita, ad esempio response_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 relativi 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à da utilizzare la porta in uso. Ciò significa che il backend verrà considerato non integro prima di essere idoneo a gestire il traffico reale.
      • Utilizza questo 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 selezionare un backend. Ciò potrebbe significare che tutti i backend sono in stato non integro. 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 inviata tramite proxy al client. Ciò 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 che ha un timeout TCP più breve di quello del bilanciatore del carico. Per maggiori dettagli, vedi Timeout e tentativi.
      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 di rispondere. Valuta la possibilità di aumentare il timeout del servizio di backend o di capire perché il servizio impiega così tanto tempo a rispondere.
  4. Verifica che il parametro di configurazione keepalive per il software del server HTTP in esecuzione sull'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 è stata chiusa in modo imprevisto durante l'invio della richiesta HTTP o prima che sia stata ricevuta la risposta HTTP completa. Ciò può accadere perché il parametro di configurazione keepalive per il software del server web in esecuzione sulistanza di backendnd è inferiore al timeout keepalive fisso del bilanciatore del carico. Assicurati che la configurazione del timeout keepalive per il software server HTTP su ogni backend sia impostata su un valore leggermente superiore a 10 minuti (il valore consigliato è 620 secondi).

Risoluzione degli errori HTTP 408

Con il traffico HTTP, il tempo massimo a disposizione del client per completare l'invio della richiesta è uguale al timeout del servizio di backend. Se visualizzi risposte HTTP 408 con jsonPayload.statusDetail client_timed_out, significa che non è stato fatto alcun progresso durante l'esecuzione del proxy della richiesta dal client o della risposta dal backend. Se il problema è dovuto a 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 per i 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 (GFE o subnet solo proxy)
  • Connessione 2, dal bilanciatore del carico (GFE o subnet solo proxy) alla VM o all'endpoint 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 che utilizzi. Per maggiori dettagli, vedi Indirizzi IP di origine per i pacchetti 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, riceverai il seguente messaggio di errore al posto dell'oggetto:


NoSuchKey
The specified key does not exist.

La compressione non funziona

Un bilanciatore del carico delle applicazioni esterno non comprime né decomprime le risposte, ma può fornire risposte generate dal servizio di backend compresse utilizzando strumenti come gzip o DEFLATE.

Se le risposte gestite dal bilanciatore del carico non sono compresse, ma dovrebbero esserlo, verifica che il software del server web in esecuzione sulle tue istanze sia configurato per comprimere le risposte. Per impostazione predefinita, alcuni software dei 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é è 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, potresti dover sostituire la configurazione predefinita del server web per indicargli di comprimere le risposte anche se la richiesta possiede un'intestazione Via.

Per configurare i backend nginx in modo che gestiscano le risposte compresse sottoposte a proxy tramite un bilanciatore del carico delle applicazioni esterno:

Per configurare i backend Apache in modo che servano risposte compresse sottoposte a proxy tramite un bilanciatore del carico delle applicazioni esterno:

Risolvere i problemi relativi ai backend in stato non integro

Risolvere i problemi relativi a HTTP/2 ai backend

Assicurati che l'istanza di backend sia integra e supporti il protocollo HTTP/2. Puoi verificarlo testando la connettività all'istanza di backend utilizzando HTTP/2. Assicurati che la VM utilizzi suite di crittografia conformi alle specifiche HTTP/2. Ad esempio, alcune suite di crittografia TLS 1.2 non sono consentite da HTTP/2. Fai riferimento alla lista nera delle suite di crittografia TLS 1.2.

Dopo aver verificato che la VM utilizza 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 bilanciamento del carico sia configurato per comunicare con la porta corretta sulla VM.

Risoluzione dei problemi relativi al backend esterno e ai NEG internet

Prima di esaminare i problemi, acquisisci familiarità con le seguenti pagine:

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.
  • Il nome di dominio completo associato può essere risolto correttamente tramite DNS (se utilizzi il tipo di endpoint FQDN).
  • L'endpoint è accessibile su internet.

Se il traffico non riesce a raggiungere l'endpoint, il che comporta 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 (dopo ip4:) e assicurati che questi intervalli siano consentiti dal firewall o dall'elencocontrollo dell'accessoo (ACL) al cloud.

Dopo aver configurato un backend esterno, le richieste al backend esterno non sono riuscite e hanno restituito un errore 5xx

  • Seleziona Logging.
  • Verifica che il gruppo di endpoint di rete sia configurato con l'IP:porta o l'FQDN:porta corretti per il tuo backend esterno.
  • Se utilizzi un nome di dominio completo, assicurati che sia risolvibile tramite Google Public DNS. Puoi verificare che il nome di dominio completo sia risolvibile tramite Google Public DNS seguendo questi passaggi o utilizzando direttamente l'interfaccia web.
  • Se accedi al bilanciatore del carico solo sul suo IP esterno e il tuo web server di origine prevede un nome host, assicurati di inviare un'intestazione host HTTP valida al backend configurando un'intestazione della richiesta personalizzata.
  • Se comunichi con un backend tramite HTTPS o HTTP2 (come impostato nel campo protocol del servizio di backend) configurato come endpoint di backend esterno INTERNET_FQDN_PORT, assicurati che l'origine presenti un certificato TLS (SSL) valido e che l'FQDN configurato corrisponda a un nome alternativo del soggetto (Subject Alternative Name) nell'elenco dei nomi alternativi del soggetto dei certificati. Un certificato valido è definito come un certificato firmato da un'autorità di certificazione pubblica e non scaduto.
  • Quando utilizzi endpoint di backend esterni INTERNET_FQDN_PORT, i certificati autofirmati non vengono accettati dal bilanciatore del carico e vengono rifiutati.
  • Quando utilizzi HTTPS o HTTP/2 con endpoint di tipo INTERNET_IP_PORT, non viene eseguita alcuna convalida del certificato SSL/controllo SAN. Ciò significa che è possibile utilizzare certificati autofirmati. Quando utilizzi SSL, ti consigliamo di utilizzare gli endpoint INTERNET_FQDN_PORT per assicurarti che i certificati server e i SAN possano essere convalidati.

Le risposte del mio backend esterno non vengono memorizzate nella cache da Cloud CDN

Assicurati che:

  • Hai abilitato Cloud CDN sul servizio di backend contenente il NEG che punta al tuo backend esterno impostando enableCDN su true.
  • Le risposte gestite dal 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, acquisisci familiarità con le seguenti pagine:

Le richieste non vanno a buon fine e viene visualizzato un errore 404

Assicurati che la risorsa serverless sottostante (ad esempio un servizio App Engine, Cloud Run Functions o Cloud Run) 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 instradare 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 sottostante funziona come previsto. Ciò significa che se il tuo servizio in una regione restituisce errori, ma l'infrastruttura complessiva di Cloud Run, Cloud Run Functions o App Engine in quella regione funziona normalmente, il bilanciatore del carico delle applicazioni esterno non indirizzerà automaticamente il traffico verso altre regioni. Assicurati di testare a fondo le nuove versioni dei tuoi servizi prima di indirizzarvi il traffico degli utenti.

Gestione delle mancate corrispondenze della maschera URL

Se l'applicazione della maschera URL configurata a un URL di richiesta utente non restituisce un nome di servizio o se restituisce un nome di servizio inesistente, 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 URL, il bilanciatore del carico restituisce un errore HTTP 404 (Risorsa 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).

API Gateway: in caso di mancata corrispondenza della maschera URL, il bilanciatore del carico restituisce un errore HTTP 404 (Non trovato).

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.

Risolvere i problemi di inserimento del gateway del tag Google

Il gateway del tag Google non inserisce i tag correttamente o causa errori.

Per risolvere il problema, utilizza Esplora log nella console Google Cloud per analizzare i log generati dal bilanciatore del carico. I problemi del gateway dei tag Google non influiscono sul codice di risposta HTTP complessivo o sul statusDetails della richiesta della pagina web. La risposta HTTP verrà inviata senza modifiche anche se l'inserimento del tag Google non va a buon fine. Per identificare gli errori del gateway, controlla grpcStatus dell'esecuzione del plug-in nel payload JSON del bilanciatore del carico.

Assicurati che Cloud Logging sia abilitato sui servizi di backend che pubblicano i contenuti del sito web per i domini in cui Google tag Gateway è attivo. Configura questa impostazione nella console Google Cloud andando a Bilanciamento del carico > Modifica > Configurazione backend. Google Cloud Per saperne di più, consulta Abilitazione della registrazione su un servizio di backend esistente. Per il servizio di backend deve essere impostata una frequenza di campionamento del logging superiore a 0.0.

  1. Nella console Google Cloud , vai alla pagina Esplora log e seleziona il progetto corretto.

    Vai a Esplora log

  2. Modifica l'intervallo di tempo in modo che copra il periodo in cui sospetti che si siano verificati problemi. Per ulteriori informazioni, vedi Utilizzare il selettore dell'intervallo di tempo.

  3. Per visualizzare i log delle richieste gestite dal plug-in di inserimento del gateway del tag Google, utilizza questa query:

    resource.type="http_load_balancer" logName="projects/PROJECT_ID/logs/requests"  \
    jsonPayload.serviceExtensionInfo.extension="0-google-tag-gateway"
    

    Sostituisci PROJECT_ID con l'ID progetto.

  4. Identifica i potenziali errori esaminando il campo jsonPayload.serviceExtensionInfo.perProcessingRequestInfo.grpcStatus. Mostra lo stato dell'estensione del gateway del tag Google.

    • OK: l'estensione ha completato l'elaborazione senza errori gRPC.
    • Qualsiasi valore diverso da OK (ad esempio INTERNAL, UNAVAILABLE, DEADLINE_EXCEEDED): Indica un errore di esecuzione dell'estensione del gateway del tag Google.
  5. Per trovare i log in cui l'estensione gateway del tag Google ha segnalato un errore, utilizza la seguente query:

    resource.type="http_load_balancer" logName="projects/PROJECT_IDlogs/requests" \
    jsonPayload.serviceExtensionInfo.extension="0-google-tag-gateway" NOT jsonPayload.serviceExtensionInfo.perProcessingRequestInfo.grpcStatus="OK"
    
  6. Quando la query precedente restituisce risultati, esamina l'intera voce di log per correlare lo stato dell'estensione con l'esito della richiesta:

    • Errore dell'estensione gateway del tag Google: un grpcStatus diverso da OK (soprattutto nell'evento RESPONSE_BODY) indica che il processo di inserimento del tag ha rilevato un errore. Il codice gRPC specifico fornisce indizi (ad esempio, DEADLINE_EXCEEDED indica un timeout).
    • Impatto sulla richiesta dell'utente: se grpcStatus per l'estensione gateway del tag Google non è OK, controlla httpRequest.status e jsonPayload.statusDetails nella stessa voce di log. Ad esempio, un OK grpcStatus non combinato con httpRequest.status: 500 e jsonPayload.statusDetails: service_extensions_error suggerisce che l'errore dell'estensione gateway del tag Google ha causato la ricezione di un errore del server da parte dell'utente.
    • Frequenza dei problemi: l'analisi dei timestamp e della frequenza di questi log degli errori consente di determinare se i problemi di inserimento del gateway dei tag Google sono in corso, intermittenti o legati a eventi specifici.

Se riscontri problemi durante la configurazione che la documentazione non riesce a risolvere, contatta l'assistenza Google Ads.