Esta página mostra como usar o NGINX como um proxy de front-end para o contentor da sua aplicação. Isto é útil se quiser processar pedidos ou respostas. Pode adicionar a compressão gzip ou traduzir HTTP/2 para HTTP/1 se os contentores da sua aplicação suportarem apenas HTTP/1 e precisar de usar HTTP/2 ponto a ponto por motivos de desempenho.
No exemplo fornecido nesta página, um contentor Nginx é executado em todas as instâncias do Cloud Run como o contentor de publicação principal e está configurado para encaminhar pedidos para o contentor da aplicação, que é executado como um contentor sidecar, conforme mostrado neste diagrama:
A forma mais eficaz de fazer o proxying de frontend no Cloud Run é implementar o contentor do servidor proxy do servidor Nginx e o contentor da app Web como um único serviço do Cloud Run:
Este único serviço do Cloud Run aceita pedidos e entrega-os ao contentor de entrada (publicação), que, neste caso, é o servidor proxy. Em seguida, o servidor proxy envia pedidos à app Web através da interface de rede localhost
, o que evita qualquer rede externa.
A implementação como um único serviço do Cloud Run reduz as latências, a sobrecarga de gestão de serviços e elimina a exposição a redes externas. O Cloud Run não interage diretamente com os contentores auxiliares, exceto para os iniciar ou parar sempre que o serviço é iniciado ou parado.
O contentor da app Web e todos os contentores auxiliares podem ser escritos em diferentes linguagens de programação. Para ver um exemplo escrito em PHP, consulte o exemplo do PHP nginx no GitHub.
Antes de começar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run and Secret Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. - Instale e inicialize a CLI gcloud.
- Atualize a CLI do Google Cloud:
gcloud components update
- Configurar a CLI do Google Cloud:
gcloud init
- Autentique-se com a CLI do Google Cloud:
gcloud auth login
- As funções Administrador do Cloud Run e Utilizador da conta de serviço
- Qualquer função personalizada que inclua esta lista específica de autorizações
- Atribua
nginx
para ouvir na mesma porta predefinida do Cloud Run8080
, localizada emlocalhost
. - Aplique a compressão gzip para melhorar o desempenho.
- Instrua o
proxy_pass
a entregar todos os pedidos a este contentor de entrada no contentor secundário da app Web na porta do anfitrião local8888
. Aceda à página Secret Manager da Google Cloud consola:
Clique em Criar segredo.
No campo do formulário
name
, introduza nginx_config.Carregue o ficheiro
nginx.conf
localizado emmulti-container/hello-nginx-sample/nginx.conf
como o valor secreto.Manter as predefinições (
Google-owned and Google-managed encryption key, etc
).Clique em Criar segredo.
Conceda à conta de serviço de computação do projeto acesso a este novo segredo. Para o fazer, aceda à página IAM na Google Cloud consola:
Localize a conta de serviço principal com o nome:
Compute Engine default service account
e clique em Editar principal.Clique em Adicionar outra função e selecione Acesso ao segredo do Secret Manager.
Clique em Guardar.
Num terminal, use o seguinte comando para criar um novo segredo do
nginx_config
no Secret Manager:gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'
Conceda à conta de serviço de computação do projeto acesso a este novo segredo através do 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'
Verifique se o segredo foi criado executando
gcloud secrets list
.Se estiver a criar um novo serviço, ignore este passo. Se estiver a atualizar um serviço existente, transfira a respetiva configuração YAML:
gcloud run services describe SERVICE --format export > service.yaml
Em
service.yaml
, adicione o seguinte:Aceda à página Cloud Run na Google Cloud consola:
Selecione Serviços no menu e clique em Implementar contentor para apresentar o formulário Criar serviço.
- Selecione Implementar uma revisão a partir de uma imagem de contentor existente e introduza
nginx
como URL da imagem de contentor. - No campo Nome do serviço, indique um nome para o seu serviço, por exemplo,
hello-mc
. - Na lista Região, selecione uma localização para implementar, por exemplo,
us-west1
. - Em Autenticação, selecione Permitir acesso público. Se não tiver autorizações (função de administrador do Cloud Run) para selecionar esta opção, o serviço é implementado e requer autenticação.
- Selecione Implementar uma revisão a partir de uma imagem de contentor existente e introduza
Clique em Recipientes, volumes, trabalhar em rede, segurança para expandir o formulário de configuração.
- Clique no separador Volumes.
- Clique em Adicionar volume.
- Na lista Tipo de volume, selecione Secreto.
- No campo Nome do volume, introduza
nginx-conf-secret
. - No campo Segredo, introduza nginx_config.
- Em Caminhos especificados para versões secretas, especifique default.conf como o caminho e latest como a versão.
- Clique em Criar para criar o volume secreto.
Clique no separador Contentores para apresentar o formulário Editar contentor.
- Clique em Definições e, em Recursos, altere a memória para 256 MiB e a CPU para 1 CPU.
- Clique em Volumes montados.
- Clique em Montar volume.
- Selecione nginx-conf-secret na lista de nomes.
- Em Caminho de montagem, introduza etc/nginx/conf.d.
- Clique em Concluído para concluir a configuração do primeiro contentor.
Clique em Adicionar contentor para adicionar o contentor sidecar e apresentar o formulário Novo contentor.
- Selecione o URL da imagem do contentor predefinido us-docker.pkg.dev/cloudrun/container/hello
- Clique no separador Definições e, de seguida, em Recursos, altere a memória para 256 MiB e a CPU para 1 CPU.
- Clique em Variáveis e segredos.
- Clique em Adicionar variável.
- Introduza PORT como o novo nome da variável de ambiente e 8888 como o valor.
- Clique em Concluído.
Navegue para o formulário Editar contentor do primeiro contentor (
nginx
).- Clique no separador Definições.
- Em Ordem de arranque do contentor, selecione
nginx
na lista Depende de. Isto significa que o contentornginx
só é iniciado depois de o contentorhello
ser iniciado com êxito. - Clique em Criar e aguarde pela implementação do serviço.
Num terminal, clone o repositório da app de exemplo para a sua máquina local:
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
Altere para o diretório que contém o código de exemplo do Cloud Run:
cd cloud-run-samples/multi-container/hello-nginx-sample/
Autorizações necessárias para a implementação
Tem de ter UMA das seguintes opções:
Vista geral da configuração
Estas instruções usam imagens de contentores pré-criadas, pelo que a única coisa necessária para o proxying de front-end é configurar os contentores e o próprio serviço.
Configure o contentor de entrada Nginx
A imagem do contentor está nginx
disponível no Docker Hub.
Está praticamente pronto a usar, exceto que tem de ser configurado para ser executado como um serviço de proxy, fornecendo os pedidos de proxy à porta onde o contentor sidecar está a escutar localhost
. O exemplo nesta página também ativa a compressão gzip para pedidos e respostas.
A configuração é fornecida através de um ficheiro de texto montado em /etc/nginx/conf.d/nginx.conf
. Uma vez que não pode editar diretamente ficheiros no contentor, tem de montar um volume em /etc/nginx/conf.d/
que contenha o ficheiro de configuração. Uma forma de montar um ficheiro numa localização específica num contentor em execução no Cloud Run é armazenar o conteúdo do ficheiro num segredo do Secret Manager e montar esse segredo na localização selecionada.
Copie o seguinte num ficheiro com o nome nginx.conf
no diretório atual da sua máquina local.
Na configuração, faça o seguinte:
Crie um segredo com o conteúdo do ficheiro nginx.conf
.
Consola
gcloud
Acerca da imagem de exemplo da barra lateral da app Web
Estas instruções usam a imagem do contentor de exemplo em
us-docker.pkg.dev/cloudrun/container/hello
. Tem de especificar o número da porta em que o contentor vai escutar e localhost
como anfitrião, conforme descrito em Especifique a configuração do contentor auxiliar, conforme descrito nas secções seguintes.
Configure o serviço com vários contentores
Pode usar a Google Cloud consola ou o ficheiro YAML do Cloud Run para configurar um serviço do Cloud Run com mais do que um contentor.
Na configuração do serviço, especifique o servidor proxy Nginx como contentor de entrada (publicação), a porta na qual vai escutar, se aceita pedidos HTTP 1 ou HTTP 2 e a ordem de início do contentor. O contentor de entrada (servidor proxy) depende do sidecar da app Web, pelo que o sidecar da app Web tem de ser iniciado primeiro.
Estas configurações são apresentadas nas secções seguintes.
Adicione metadados YAML
Consola
Navegue até Implementar o serviço para ver as instruções completas da consola.
YAML
A secção descreve a revisão do serviço, que inclui propriedades que podem variar de revisão para revisão.
Especifique a ordem de arranque do contentor
Consola
Navegue até Implementar o serviço para ver as instruções completas da consola.
YAML
Em service.yaml
, anexe o seguinte:
Repare na anotação container-dependencies
que indica ao Cloud Run para aguardar que o contentor hello seja iniciado
antes de iniciar o contentor nginx. Caso contrário, se o contentor nginx for iniciado primeiro, pode tentar encaminhar um pedido Web para o contentor da app Web que não está pronto, o que gera respostas de erro Web.
Cada contentor pode ter opcionalmente uma propriedade de nome definida para si, que pode ser usada para se referir a ele noutras diretivas.
O contentor de publicação executa o servidor proxy, denominado nginx
. Este é o contentor para o qual o Cloud Run envia pedidos recebidos. Por isso, tem de especificar a versão do HTTP
e a porta do contentor para os enviar.
Especifique a configuração do contentor de publicação
Consola
Navegue até Implementar o serviço para ver as instruções completas da consola.
YAML
No ficheiro service.yaml
, anexe o seguinte:
O servidor nginx
requer um ficheiro de configuração no diretório /etc/nginx/conf.d/
. Para o fazer, monte um volume que contenha o ficheiro nessa localização. A secção volumeMount
especifica um volume denominado configuration
a ser colocado aí. O volume em si é definido na sua própria secção mais tarde no ficheiro.
Especifique a configuração do contentor sidecar
Consola
Navegue até Implementar o serviço para ver as instruções completas da consola.
YAML
Em service.yaml
, anexe o seguinte:
A aplicação hello
também precisa de informações de configuração. O servidor fica à escuta de pedidos recebidos na porta especificada na variável de ambiente PORT
. Esse nome e valor são especificados na secção env
.
Especifique o volume secreto
Consola
Navegue até Implementar o serviço para ver as instruções completas da consola.
YAML
No ficheiro service.yaml
, anexe o seguinte:
Especifique a configuração volume
montada na secção volumeMount
. Contém um único ficheiro denominado nginx.conf
cujo conteúdo é definido como o valor do segredo denominado nginx-conf-secret
.
Implemente o serviço
Consola
YAML
Para implementar o contentor do servidor proxy e o contentor da app Web como um único serviço:
gcloud run services replace service.yaml
Valide o serviço implementado
Para validar a implementação bem-sucedida, copie o URL do Cloud Run gerado e abra-o num navegador ou use este comando para enviar um pedido autenticado:
curl --header "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
Deve receber uma mensagem de proxy nginx que foi
transferida com êxito para o contentor sidecar hello com o
estado de resposta 200
.
Experimente
Para continuar este tutorial:
gcloud
O que se segue?
Para explorar mais sobre a utilização de sidecars num serviço do Cloud Run: