Proxy frontend con Nginx

Questa pagina mostra come utilizzare NGINX come proxy frontend per il container dell'applicazione. Questa opzione è utile se vuoi elaborare richieste o risposte. Puoi aggiungere la compressione gzip o convertire HTTP/2 in HTTP/1 se i container delle 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 le 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 proxy frontend in Cloud Run è eseguire il deployment del container del server proxy Nginx e del container dell'app web come un unico servizio Cloud Run:

Cloud Run mc hello nginx 2

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

Il deployment come singolo servizio Cloud Run riduce le latenze, il sovraccarico di gestione dei servizi ed elimina l'esposizione a reti esterne. Cloud Run non interagisce direttamente con i container sidecar, se non per avviarli o arrestarli all'avvio o all'arresto del servizio.

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

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

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

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Run and Secret Manager APIs.

    Enable the APIs

  7. Installa e inizializza gcloud CLI.
  8. Aggiorna Google Cloud CLI: gcloud components update
  9. Configura Google Cloud CLI: gcloud init
  10. Esegui l'autenticazione con Google Cloud CLI: gcloud auth login
  11. Autorizzazioni richieste per il deployment

    Devi avere UNO dei seguenti documenti:

    Panoramica configurazione

    Queste istruzioni utilizzano immagini container predefinite, quindi l'unica cosa richiesta per il proxy frontend è configurare i container e il servizio stesso.

    Configura il container Ingress Nginx

    L'immagine container è nginx disponibile su Docker Hub. È quasi pronto per l'uso, tranne per il fatto che deve essere configurato per essere eseguito come servizio proxy, inviando le richieste proxy alla porta su cui il container sidecar è in ascolto localhost. L'esempio in questa pagina attiva anche la compressione gzip per richieste e risposte.

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

    Copia quanto segue in un file denominato nginx.conf nella directory attuale del computer 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 di Cloud Run 8080, che si trova su localhost.
    • Applica la compressione gzip per migliorare il rendimento.
    • Indica a proxy_pass di inviare tutte le richieste a questo container di ingresso al container collaterale dell'app web sulla 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 in multi-container/hello-nginx-sample/nginx.conf come valore del secret.

    5. Mantieni le impostazioni predefinite (Google-owned and 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 principale con il nome Compute Engine default service account e fai clic su Modifica entità.

    9. Fai clic su Aggiungi un altro ruolo e seleziona Accessor segreti di Secret Manager.

    10. Fai clic su Salva.

    gcloud

    1. In un terminale, utilizza 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 al account di servizio di 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 sidecar 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 sarà in ascolto e localhost come host, come descritto in Specificare la configurazione del container sidecar, come descritto nelle sezioni seguenti.

    Configura il servizio multicontainer

    Puoi utilizzare la Google Cloud console 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 contenitore in entrata (di gestione), la porta su cui ascolterà, se accetta richieste HTTP 1 o HTTP 2 e l'ordine di avvio del contenitore. Il container di ingresso (proxy server) dipende dal sidecar dell'app web, quindi quest'ultimo deve essere avviato per primo.

    Queste configurazioni sono mostrate nelle sezioni successive.

    Aggiungere metadati YAML

    Console

    Vai a Esegui il 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

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

    Specificare l'ordine di avvio del container

    Console

    Vai a Esegui il 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]}"

    Prendi nota dell'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 tentare di eseguire il proxy di una richiesta web al container dell'app web non pronto, il che genererebbe risposte di errore web.

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

    Specifica la configurazione del container di pubblicazione

    Console

    Vai a Esegui il 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 farlo, monta un volume contenente il file in quella posizione. La sezione volumeMount specifica un volume denominato configuration da inserire. Il volume stesso è definito in una sezione separata più avanti nel file.

    Specifica la configurazione del container sidecar

    Console

    Vai a Esegui il 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

    Anche l'applicazione hello richiede informazioni di configurazione. È in ascolto delle richieste in entrata sulla porta specificata nella variabile di ambiente PORT. Il nome e il valore sono specificati nella sezione env.

    Specifica il volume secret

    Console

    Vai a Esegui il 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 il cui contenuto è definito 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. Seleziona Servizi dal menu e fai clic su Esegui il deployment del contenitore per visualizzare il modulo Crea servizio.

      1. Seleziona Esegui il deployment di una revisione da un'immagine container esistente e inserisci nginx come URL dell'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. Se non disponi delle autorizzazioni (ruolo Amministratore di Cloud Run) per selezionare questa opzione, il servizio verrà implementato e richiederà l'autenticazione.
    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. Nell'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 latest come versione.
      7. Fai clic su Crea per creare il volume secret.
    4. Fai clic sulla scheda Container per visualizzare il modulo Modifica contenitore.

      1. Fai clic su Impostazioni, quindi in Risorse imposta la memoria su 256 MiB e la CPU su 1 CPU.
      2. Fai clic su Montaggi di volumi.
      3. Fai clic su Monta 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 sidecar 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 256 MiB 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. Nella sezione Ordine di avvio del contenitore, seleziona nginx dall'elenco Dipende da. Ciò significa che il container nginx viene avviato solo dopo l'avvio riuscito del container hello.
      3. Fai clic su Crea e attendi il deployment del servizio.

    YAML

    Per eseguire il deployment del container del server proxy e del container dell'app web come unico servizio:

    gcloud run services replace service.yaml

    Verificare il servizio di cui è stato eseguito il deployment

    Per verificare che il deployment sia stato eseguito correttamente, 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)" SERVICE_URL

    Dovresti visualizzare un proxy nginx che è stato trasferito correttamente al container collaterale hello con lo stato della risposta 200.

    Prova anche tu

    Per seguire questo tutorial:

    gcloud

    1. In un terminale, clona il repository dell'app di esempio sulla 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 scoprire di più sull'utilizzo dei sidecar in un servizio Cloud Run: