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
| Diretiva | O 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"]| Trecho | Efeito |
|---|---|
ports: ["80:80"] | só o Nginx é acessível de fora |
:ro | o 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
| Sintoma | Causa provável | Solução |
|---|---|---|
| 502 Bad Gateway | O 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 Timeout | A 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 Nginx | Ela 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. |