Nesta página, mostramos como usar o NGINX como proxy de front-end para seu contêiner de aplicativos. Isso é útil se você quer processar solicitações ou respostas. É possível adicionar compactação gzip ou converter HTTP/2 para HTTP/1 se os contêineres de seu aplicativo forem compatíveis apenas com HTTP/1 e você precisar usar o HTTP/2 de ponta a ponta para melhorar o desempenho.
No exemplo fornecido nesta página, um contêiner do Nginx é executado em todas as instâncias do Cloud Run como o contêiner de exibição principal e é configurado para encaminhar solicitações ao contêiner do aplicativo, que é executado como um contêiner de arquivo secundário, conforme mostrado neste diagrama:
A maneira mais eficaz de fazer o proxy da Internet no Cloud Run é implantar o contêiner do servidor proxy do servidor Nginx e o contêiner do app da Web como um único serviço do Cloud Run:
Esse único serviço do Cloud Run aceita solicitações e as entrega ao contêiner de entrada (exibição), que, nesse caso, é o servidor proxy. Em seguida, o servidor proxy envia solicitações para o app da Web pela interface de rede localhost
, o que evita qualquer rede externa.
A implantação como um único serviço do Cloud Run reduz as latências, a sobrecarga de gerenciamento de serviços e elimina a exposição a redes externas. O Cloud Run não interage diretamente com os contêineres de arquivo secundário, exceto para iniciá-los ou interrompê-los sempre que o serviço for iniciado ou interrompido.
O contêiner do app da Web e os contêineres de arquivos secundários podem ser escritos em linguagens de programação diferentes. Para uma amostra escrita em PHP, consulte a amostra 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.
-
Make sure 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.
-
Make sure 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
- Configure a CLI do Google Cloud:
gcloud init
- Autenticar com a CLI do Google Cloud:
gcloud auth login
Permissões necessárias para implantar
Você precisa ter UM dos seguintes papéis:
- Os papéis Administrador do Cloud Run e Usuário da conta de serviço
- Qualquer papel personalizado que inclua esta lista específica de permissões
Visão geral da configuração
Essas instruções usam imagens de contêiner pré-criadas. Portanto, o único requisito para o proxy de front-end é configurar os contêineres e o próprio serviço.
Configurar o contêiner de entrada do Nginx
A imagem do contêiner está nginx
disponível no Docker Hub.
O contêiner já está quase pronto
para uso, mas precisa ser configurado para ser executado como um serviço de proxy,
entregando as solicitações por proxy para a porta em que o contêiner do arquivo secundário está
detectando em localhost
. O exemplo nesta página também ativa a compactação gzip para solicitações e respostas.
A configuração é fornecida usando um arquivo de texto montado
em /etc/nginx/conf.d/nginx.conf
. Como não é possível editar arquivos diretamente no contêiner, é preciso ativar um volume em /etc/nginx/conf.d/
que contenha o arquivo de configuração. Uma maneira de montar um arquivo em um local específico em um contêiner em execução no Cloud Run é armazenar o conteúdo do arquivo em um secret do Secret Manager e montar esse secret no local selecionado.
Copie o seguinte em um arquivo chamado nginx.conf
no diretório atual da máquina local.
Na configuração, faça o seguinte:
- Atribua
nginx
para detectar na mesma porta padrão8080
do Cloud Run, localizada emlocalhost
- Aplique a compactação gzip para melhorar o desempenho.
- Instrua
proxy_pass
para enviar todas as solicitações para esse contêiner de entrada para o contêiner de arquivo secundário do app da Web na porta localhost8888
.
Crie um secret com o conteúdo do arquivo nginx.conf
.
Console
Acesse a página do Secret Manager no console do Google Cloud:
Clique em Criar secret.
No campo do formulário
name
, insira nginx_config.Faça upload do arquivo
nginx.conf
localizado emmulti-container/hello-nginx-sample/nginx.conf
como o valor do secret.Mantenha os valores padrão (
Google-managed encryption key, etc
).Clique em Criar secret.
Conceda à conta de serviço de computação do projeto acesso a esse novo secret. Para fazer isso, acesse a página IAM no console do Google Cloud:
Localize a conta de serviço principal com o nome:
Compute Engine default service account
e clique em Editar principal.Clique em Adicionar outro papel e selecione Acessador de secrets do Secret Manager.
Clique em Salvar.
gcloud
Em um terminal, use o seguinte comando para criar um novo secret
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 esse novo secret com o 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 secret foi criado executando
gcloud secrets list
.
Sobre a imagem de exemplo de arquivo secundário do app da Web
Estas instruções usam a imagem do contêiner de amostra em us-docker.pkg.dev/cloudrun/container/hello
. É necessário
especificar o número da porta que o contêiner vai detectar e localhost
como o host, conforme descrito em Especificar a configuração do contêiner de arquivo secundário, conforme descrito nas seções a seguir.
Configurar o serviço de vários contêineres
É possível usar o console do Google Cloud ou o arquivo YAML do Cloud Run para configurar um serviço do Cloud Run com mais de um contêiner.
Na configuração do serviço, especifique o servidor proxy Nginx como contêiner de entrada (exibição), a porta na qual ele detectará, se aceita solicitações HTTP 1 ou HTTP 2 e a ordem inicial do contêiner. O contêiner de entrada (servidor proxy) depende do arquivo secundário do app da Web. Portanto, é necessário iniciar esse arquivo primeiro.
Essas configurações vão ser mostradas nas próximas seções.
Adicionar metadados YAML
Console
Navegue até Implantar o serviço para ver as instruções completas do console.
YAML
Se você estiver criando um novo serviço, pule esta etapa. Se você estiver atualizando um serviço, faça o download da configuração YAML correspondente:
gcloud run services describe SERVICE --format export > service.yaml
Em
service.yaml
, inclua o seguinte:
Esta seção descreve a revisão do serviço, incluindo propriedades que podem variar de uma revisão para outra.
Especificar a ordem de inicialização do contêiner
Console
Navegue até Implantar o serviço para ver as instruções completas do console.
YAML
Em service.yaml
, anexe o seguinte:
Observe a anotação container-dependencies
que diz ao Cloud Run para aguardar a inicialização do contêiner hello antes de iniciar o contêiner nginx. Caso contrário, se o contêiner nginx começar primeiro, ele pode tentar fazer proxy de uma solicitação da Web para o contêiner do app da Web que não está pronto, o que geraria respostas de erro da Web.
Como alternativa, cada contêiner pode ter uma propriedade de nome definida, que pode ser usada para se referir a ele em outras diretivas.
O contêiner de exibição executa o servidor proxy, chamado nginx
. Este é o contêiner ao qual o Cloud Run envia solicitações de entrada. Portanto, você precisa especificar a versão de HTTP
e a porta do contêiner para entregá-las.
Especificar a configuração do contêiner de exibição
Console
Navegue até Implantar o serviço para ver as instruções completas do console.
YAML
No arquivo service.yaml
, anexe o seguinte:
O servidor nginx
requer um arquivo de configuração no diretório /etc/nginx/conf.d/
. Para fazer isso, monte um volume contendo o arquivo no local. A seção volumeMount
especifica um volume chamado configuration
a ser colocado lá. O próprio volume é definido em sua própria seção posteriormente no arquivo.
Especificar a configuração do contêiner de arquivo secundário
Console
Navegue até Implantar o serviço para ver as instruções completas do console.
YAML
Em service.yaml
, anexe o seguinte:
O aplicativo hello
também precisa de informações de configuração. Ele detecta solicitações de entrada na porta especificada na variável de ambiente PORT
. O nome e o valor são especificados na seção env
.
Especificar o volume do secret
Console
Navegue até Implantar o serviço para ver as instruções completas do console.
YAML
No arquivo service.yaml
, anexe o seguinte:
Especifique a configuração volume
ativada na seção volumeMount
. Ela contém um único arquivo chamado nginx.conf
, cujo conteúdo é definido como o valor do secret chamado nginx-conf-secret
.
Implante o serviço
Console
Acesse a página do Cloud Run no Console do Google Cloud.
Clique em Implantar contêiner e selecione Serviço para exibir o formulário Criar serviço.
- Selecione Implantar uma revisão de uma imagem de contêiner atual e insira
nginx
como URL da imagem do contêiner. - No campo Nome do serviço, forneça um nome para o serviço, por exemplo,
hello-mc
. - Na lista Região, selecione um local para implantar, por exemplo,
us-west1
. - Em Autenticação, selecione
Allow unauthenticated invocations
. Se você não tiver permissões (função de administrador do Cloud Run) para selecionar essa opção, o serviço será implantado e exigirá autenticação.
- Selecione Implantar uma revisão de uma imagem de contêiner atual e insira
Clique em Contêiner(es), volumes, rede, segurança para expandir o formulário de configuração.
- Clique na guia Volumes.
- Clique em Adicionar volume.
- Na lista Tipo de volume, selecione Secret.
- No campo Nome do volume, digite
nginx-conf-secret
. - No campo Secret, insira nginx_config.
- Em Caminhos especificados para versões de secret, especifique default.conf como o caminho e latest como a versão.
- Clique em Criar para criar o volume do secret.
Clique na guia Contêineres para exibir o formulário Editar contêiner.
- Clique em Configurações e, em Recursos, altere a memória para 256MiB e a CPU para 1 CPU.
- Clique em Montagens de volumes.
- Clique em Montar volume.
- Selecione nginx-conf-secret na lista de nomes.
- Em Caminho de montagem, insira etc/nginx/conf.d.
- Clique em Concluído para finalizar a configuração do primeiro contêiner.
Clique em Adicionar contêiner para incluir o contêiner do arquivo secundário e exibir o formulário Novo contêiner.
- Selecione o URL da imagem do contêiner padrão us-docker.pkg.dev/cloudrun/container/hello
- Clique na guia Configurações e, em Recursos, mude a memória para 256MiB e a CPU para 1 CPU.
- Clique em Variáveis e secrets.
- Clique em Adicionar variável.
- Digite PORT como o novo nome da variável de ambiente e 8888 como o valor.
- Clique em Concluído.
Acesse o formulário Editar contêiner para o primeiro contêiner (
nginx
).- Clique na guia Configurações.
- Em Ordem de inicialização do contêiner, selecione
nginx
na lista Depende de. Isso significa que o contêinernginx
é iniciado somente após a inicialização do contêinerhello
. - Clique em Criar e aguarde a implantação do serviço.
gcloud
Para implantar o contêiner do servidor proxy e o contêiner do app da Web como um único serviço:
gcloud run services replace service.yaml
Verificar o serviço implantado
gcloud
Para verificar a implantação, copie o URL do Cloud Run gerado e abra-o em um navegador ou use este comando para enviar uma solicitação autenticada:
curl --header "Authorization: Bearer $(gcloud auth print-identity-token)"
Você verá um proxy nginx que
foi transferido para o contêiner de arquivo secundário hello com
status de resposta 200
.
Tente fazer isso
Para acompanhar este tutorial:
gcloud
Em um terminal, clone o repositório do app de exemplo na sua máquina local:
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
Mude para o diretório que contém o código de amostra do Cloud Run:
cd cloud-run-samples/multi-container/hello-nginx-sample/
A seguir
Para saber mais sobre o uso de arquivos secundários em um serviço do Cloud Run:
- Os arquivos secundários do Cloud Run permitem padrões avançados de vários contêineres
- Como implantar no Cloud Run