~ / blog / devops
16 set 2026devops6 min de leitura

Nginx como reverse proxy para containers

Expor várias apps Docker na porta 80/443 com upstream, headers e TLS.

NginxDockerproxy

Config básica

Em vez de publicar a porta de cada container, um Nginx na frente centraliza TLS e roteamento.

upstream api {
  server api:8000;
}
server {
  listen 80;
  server_name exemplo.com;
  location / {
    proxy_pass http://api;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

No Compose

Monte o conf como volume read-only e use a rede interna para o serviço api (sem publicar 8000 no host).

Próximo passo: TLS com Certbot ou Caddy. Veja o módulo final do curso Docker.

Diretivas explicadas

DiretivaO que faz
upstream api { server api:8000; }Define um grupo de destinos. api:8000 é o nome do serviço na rede do Docker e a porta em que ele escuta.
listen 80;Porta em que o Nginx recebe conexões.
server_name exemplo.com;Domínio atendido por esse bloco.
location / { ... }Regra para as URLs que começam com /, ou seja, todas.
proxy_pass http://api;Encaminha a requisição para o upstream api.
proxy_set_header Host $host;Repassa o domínio original que o cliente pediu.
proxy_set_header X-Real-IP $remote_addr;Envia o IP real do cliente à aplicação.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;Registra a cadeia de IPs pelos quais a requisição passou.
proxy_set_header X-Forwarded-Proto $scheme;Informa se o cliente usou http ou https.

Exemplo: o mesmo proxy no Docker Compose

O texto do artigo diz para montar o arquivo como volume somente leitura e não publicar a porta da aplicação. Em um docker-compose.yml:

services:
  nginx:
    image: nginx:stable
    ports: ["80:80"]
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on: [api]
  api:
    build: ./api
    expose: ["8000"]
TrechoEfeito
ports: ["80:80"]só o Nginx é acessível de fora
:roo container não consegue alterar o arquivo de configuração
expose: ["8000"]a porta fica visível apenas dentro da rede do Compose
depends_on: [api]o api sobe antes do Nginx

Depois de mudar a configuração, valide e recarregue sem derrubar o serviço: docker compose exec nginx nginx -t e docker compose exec nginx nginx -s reload.

Erros comuns e como resolver

SintomaCausa provávelSolução
502 Bad GatewayO Nginx não consegue falar com o upstream: container parado, nome ou porta errados.Veja docker compose ps e os logs do container api.
504 Gateway TimeoutA aplicação demora mais do que o tempo limite do proxy (60 segundos por padrão).Investigue a lentidão e, só se necessário, aumente o proxy_read_timeout.
host not found in upstream "api"O nome não é resolvido: o serviço não está na mesma rede ou não subiu.Coloque os dois na mesma rede do Compose e confira o nome do serviço.
A aplicação registra sempre o IP do NginxEla não lê os cabeçalhos X-Forwarded-For ou X-Real-IP.Configure a aplicação para confiar no proxy e usar esses cabeçalhos.

Quer aplicar isso ao seu contexto?

Se esse problema existe na sua operação, podemos analisar o cenário em um diagnóstico gratuito de 30 minutos.

solicitar diagnóstico gratuito →

Leia também