Proxy di frontend con Nginx

Questa pagina mostra come utilizzare NGINX come proxy frontend per il container delle applicazioni. Questo è utile se vuoi elaborare richieste o risposte. Puoi aggiungere la compressione gzip o tradurre HTTP/2 in HTTP/1 se i container delle tue applicazioni supportano solo HTTP/1 e devi utilizzare HTTP/2 end-to-end per motivi di prestazioni.

Nell'esempio fornito in questa pagina, un container Nginx viene eseguito su ogni istanza Cloud Run come container di servizio principale ed è configurato per inoltrare richieste al container dell'applicazione, che viene eseguito come container sidecar, come mostrato in questo diagramma:

Cloud Run mc hello nginx 1

Il modo più efficace per eseguire il proxying frontend in Cloud Run è eseguire il deployment del container del server proxy del server Nginx e del container dell'app web come singolo servizio Cloud Run:

Cloud Run mc hello nginx 2

Questo singolo servizio Cloud Run accetta le richieste e le invia al container in entrata (di distribuzione), che in questo caso è il server proxy. Il server proxy invia quindi le richieste all'app web tramite l'interfaccia di rete localhost, evitando le reti esterne.

Il deployment come singolo servizio Cloud Run riduce le latenze e l'overhead associato alla gestione dei servizi ed elimina l'esposizione a reti esterne. Cloud Run non interagisce direttamente con i container collaterali, se non per avviarli o arrestarli ogni volta che il servizio viene avviato o arrestato.

Il container dell'app web e gli eventuali container collaterali possono essere scritti in linguaggi di programmazione diversi. Per un esempio scritto in PHP, consulta l'esempio di PHP nginx in GitHub.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita le API Cloud Run and Secret Manager .

    Abilita le API

  7. Installa e inizializza gcloud CLI.
  8. Aggiorna Google Cloud CLI: gcloud components update
  9. Configura Google Cloud CLI: gcloud init
  10. Autenticazione con Google Cloud CLI: gcloud auth login

Autorizzazioni necessarie per il deployment

Devi avere UNO dei seguenti documenti:

  • Proprietario
  • Editor
  • Entrambi i ruoli Amministratore Cloud Run e Utente account di servizio
  • Qualsiasi ruolo personalizzato che include questo elenco specifico di autorizzazioni

Panoramica configurazione

Queste istruzioni utilizzano immagini container predefinite, quindi l'unica cosa richiesta per il proxy di frontend è la configurazione dei container e del servizio stesso.

Configura il container in entrata Nginx

L'immagine container è nginx disponibile in Docker Hub. In gran parte pronto per l'uso così com'è, solo che deve essere configurato per essere eseguito come servizio proxy, consegnando le richieste inviate tramite proxy alla porta dove il container collaterale è in ascolto su localhost. L'esempio in questa pagina abilita anche la compressione gzip per richieste e risposte.

La configurazione viene fornita utilizzando un file di testo montato su /etc/nginx/conf.d/nginx.conf. Poiché non puoi modificare direttamente i file nel container, devi montare un volume su /etc/nginx/conf.d/ che contenga il file di configurazione. Un modo per montare un file in una posizione specifica in un container in esecuzione su Cloud Run è archiviare il contenuto del file in un secret di Secret Manager e montare il secret nella posizione desiderata, che viene caricato in fase di runtime.

Copia quanto segue in un file denominato nginx.conf nella directory attuale della macchina locale.


server {
    # Listen at port 8080
    listen 8080; 
    # Server at localhost
    server_name _;
    # Enables gzip compression to make our app faster
    gzip on;

    location / {
        # Passes initial requests to port 8080 to `hello` container at port 8888
        proxy_pass   http://127.0.0.1:8888;
    }
}

Nella configurazione, segui questi passaggi:

  • Assegna nginx per l'ascolto sulla stessa porta predefinita 8080 di Cloud Run, situata su localhost
  • Applica la compressione gzip per migliorare le prestazioni
  • Indica tramite proxy_pass di consegnare tutte le richieste a questo container in entrata al container sidecar dell'app web alla porta localhost 8888.

Crea un secret con i contenuti del file nginx.conf.

Console

  1. Vai alla pagina Secret Manager della console Google Cloud:

    Vai a Secret Manager

  2. Fai clic su Crea secret.

  3. Nel campo del modulo name, inserisci nginx_config.

  4. Carica il file nginx.conf che si trova all'indirizzo multi-container/hello-nginx-sample/nginx.conf come valore del secret.

  5. Mantieni i valori predefiniti (Google-managed encryption key, etc).

  6. Fai clic su Crea secret.

  7. Concedi all'account di servizio Compute del progetto l'accesso a questo nuovo secret. Per farlo, vai alla pagina IAM nella console Google Cloud:

    Vai a IAM

  8. Individua l'account di servizio dell'entità con il nome Compute Engine default service account e fai clic su Modifica entità.

  9. Fai clic su Aggiungi un altro ruolo e seleziona Funzione di accesso ai secret di Secret Manager.

  10. Fai clic su Salva.

Riga di comando

  1. In un terminale, usa questo comando per creare un nuovo secret nginx_config in Secret Manager:

    gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'

  2. Concedi all'account di servizio Compute del progetto l'accesso a questo nuovo secret utilizzando il comando

    export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')
    gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'
    

  3. Verifica che il secret sia stato creato eseguendo gcloud secrets list.

Informazioni sull'immagine di esempio del file collaterale dell'app web

Queste istruzioni utilizzano l'immagine container di esempio all'indirizzo us-docker.pkg.dev/cloudrun/container/hello. Devi specificare il numero di porta su cui il container resterà in ascolto e localhost come host, come descritto in Specificare la configurazione del container collaterale, come descritto nelle sezioni seguenti.

Configura il servizio multicontainer

Puoi utilizzare la console Google Cloud o il file YAML di Cloud Run per configurare un servizio Cloud Run con più di un container.

Nella configurazione del servizio, specifica il server proxy Nginx come container in entrata (di distribuzione), la porta su cui resterà in ascolto, se accetta richieste HTTP 1 o HTTP 2, e l'ordine di avvio del container. Il container in entrata (server proxy) dipende dal sidecar dell'app web, quindi il sidecar dell'app web deve essere avviato prima.

Queste configurazioni sono mostrate nelle sezioni successive.

Aggiungi metadati YAML

Console

Vai a Deployment del servizio per le istruzioni complete della console.

YAML

  1. Se stai creando un nuovo servizio, salta questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. In service.yaml, aggiungi quanto segue:

    metadata:
      name: "MC_SERVICE_NAME"
      labels:
        cloud.googleapis.com/location: "REGION"
      annotations:
        # Required to use Cloud Run multi-containers (preview feature)
        run.googleapis.com/launch-stage: BETA
        run.googleapis.com/description: sample tutorial service
        # Externally available
        run.googleapis.com/ingress: all

Questa sezione descrive la revisione del servizio, che include proprietà che possono variare da una revisione all'altra.

Specifica l'ordine di avvio del container

Console

Vai a Deployment del servizio per le istruzioni complete della console.

YAML

In service.yaml, aggiungi quanto segue:

spec:
  template:
    metadata:
      annotations:
        # Defines container startup order within multi-container service.
        # Below requires hello container to spin up before nginx container,
        # which depends on the hello container.
        # https://cloud.google.com/run/docs/configuring/containers#container-ordering
        run.googleapis.com/container-dependencies: "{nginx: [hello]}"

Osserva l'annotazione container-dependencies che indica a Cloud Run di attendere l'avvio del container hello prima di avviare il container nginx. In caso contrario, se il container nginx viene avviato per primo, potrebbe provare a eseguire il proxy di una richiesta web al container dell'app web non pronto, generando così risposte di errore web.

Per ogni contenitore può essere facoltativamente definita una proprietà name, che può essere utilizzata per farvi riferimento in altre istruzioni. Il contenitore di pubblicazione esegue il server proxy denominato nginx. Questo è il container in cui Cloud Run consegna le richieste in entrata, quindi devi specificare la versione di HTTP e la porta del container a cui consegnarle.

Specifica la configurazione del container di pubblicazione

Console

Vai a Deployment del servizio per le istruzioni complete della console.

YAML

Nel file service.yaml, aggiungi quanto segue:

spec:
  containers:
    # A) Serving ingress container "nginx" listening at PORT 8080
    # Main entrypoint of multi-container service.
    # Source is stored in nginx_config secret in Secret Manager.
    # Any pings to this container will proxy over to hello container at PORT 8888.
    # https://cloud.google.com/run/docs/container-contract#port
    - image: nginx
      name: nginx
      ports:
        - name: http1
          containerPort: 8080
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
      # Referencing declared volume below,
      # Declaring volume to mount in current ingress container's filesystem
      # https://cloud.google.com/run/docs/reference/rest/v2/Container#volumemount
      volumeMounts:
        - name: nginx-conf-secret
          readOnly: true
          mountPath: /etc/nginx/conf.d/
      startupProbe:
        timeoutSeconds: 240
        periodSeconds: 240
        failureThreshold: 1
        tcpSocket:
          port: 8080

Il server nginx richiede un file di configurazione nella directory /etc/nginx/conf.d/. Per fare ciò, monta un volume contenente il file in quella posizione. La sezione volumeMount specifica un volume denominato configuration da posizionare. Il volume stesso viene definito nella propria sezione più avanti nel file.

Specifica la configurazione del container collaterale

Console

Vai a Deployment del servizio per le istruzioni complete della console.

YAML

In service.yaml, aggiungi quanto segue:

- image: us-docker.pkg.dev/cloudrun/container/hello
  name: hello
  env:
    - name: PORT
      value: "8888"
  resources:
    limits:
      cpu: 1000m
      memory: 512Mi
  startupProbe:
    timeoutSeconds: 240
    periodSeconds: 240
    failureThreshold: 1
    tcpSocket:
      port: 8888

L'applicazione hello necessita anche delle informazioni di configurazione. Resta in ascolto delle richieste in entrata alla porta specificata nella variabile di ambiente PORT. Quel nome e quel valore sono specificati nella sezione env.

Specifica il volume del secret

Console

Vai a Deployment del servizio per le istruzioni complete della console.

YAML

Nel file service.yaml, aggiungi quanto segue:

volumes:
  - name: nginx-conf-secret
    secret:
      secretName: nginx_config
      items:
        - key: latest
          path: default.conf

Specifica la configurazione volume montata nella sezione volumeMount. Contiene un singolo file denominato nginx.conf, i cui contenuti sono definiti come valore del secret denominato nginx-conf-secret.

Esegui il deployment del servizio

Console

  1. Vai alla pagina Cloud Run nella console Google Cloud:

    Vai a Cloud Run

  2. Fai clic su Crea servizio.

    1. Seleziona Esegui il deployment di una revisione da un'immagine container esistente e inserisci nginx come URL immagine container.
    2. Nel campo Nome servizio, fornisci un nome per il servizio, ad esempio hello-mc.
    3. Dall'elenco Regione, seleziona una località in cui eseguire il deployment, ad esempio us-west1.
    4. In Autenticazione, seleziona Allow unauthenticated invocations.
  3. Fai clic su Container, volumi, networking, sicurezza per espandere il modulo di configurazione.

    1. Fai clic sulla scheda Volumi.
    2. Fai clic su Aggiungi volume.
    3. Dall'elenco Tipo di volume, seleziona Secret.
    4. Nel campo Nome volume, inserisci nginx-conf-secret.
    5. Nel campo Secret, inserisci nginx_config.
    6. In Percorsi specificati per le versioni dei secret, specifica default.conf come percorso e il più recente come versione.
    7. Fai clic su Crea per creare il volume del secret.
  4. Fai clic sulla scheda Contenitori per visualizzare il modulo Modifica contenitore.

    1. Fai clic su Impostazioni, quindi in Risorse, imposta la memoria su 256MiB e la CPU su 1 CPU.
    2. Fai clic su Montaggi volume.
    3. Fai clic su Installa volume.
    4. Seleziona nginx-conf-secret dall'elenco dei nomi.
    5. Per Percorso di montaggio, inserisci etc/nginx/conf.d.
    6. Fai clic su Fine per completare la configurazione del primo contenitore.
  5. Fai clic su Aggiungi contenitore per aggiungere il contenitore collaterale e visualizzare il modulo Nuovo contenitore.

    1. Seleziona l'URL dell'immagine container predefinita us-docker.pkg.dev/cloudrun/container/hello
    2. Fai clic sulla scheda Impostazioni, quindi in Risorse, imposta la memoria su 256MiB e la CPU su 1 CPU.
    3. Fai clic su Variabili e secret.
    4. Fai clic su Aggiungi variabile.
    5. Inserisci PORT come nuovo nome della variabile di ambiente e 8888 come valore.
    6. Fai clic su Fine.
  6. Vai al modulo Modifica contenitore per il primo contenitore (nginx).

    1. Fai clic sulla scheda Impostazioni.
    2. In Ordine di avvio del container, seleziona nginx dall'elenco Dipende da. Ciò significa che il container nginx viene avviato solo dopo che il container hello è stato avviato correttamente.
    3. Fai clic su Crea e attendi il completamento del deployment del servizio.

Riga di comando

Per eseguire il deployment del contenitore del server proxy e del contenitore di app web come singolo servizio:

gcloud run services replace service.yaml

Verifica il servizio di cui è stato eseguito il deployment

Riga di comando

Per verificare la riuscita del deployment, copia l'URL Cloud Run generato e aprilo in un browser oppure utilizza questo comando per inviare una richiesta autenticata:

curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" 

Dovresti ricevere un proxy nginx che è stato trasferito al container sidecar hello con stato della risposta 200.

Prova anche tu

Per seguire questo tutorial:

Riga di comando

  1. In un terminale, clona il repository dell'app di esempio nella tua macchina locale:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples

  2. Passa alla directory che contiene il codice campione di Cloud Run:

    cd cloud-run-samples/multi-container/hello-nginx-sample/

Passaggi successivi

Per saperne di più sull'utilizzo dei file collaterali in un servizio Cloud Run: