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 de nginx em PHP 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.
-
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.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run and Secret Manager APIs.
- 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 do segredo.
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 componente suplementar da app Web, pelo que este 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 está definido na sua própria secção mais adiante 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
portada 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: