Configurando proxy reverso com Nginx ou Traefik
Um proxy reverso recebe as requisições dos visitantes e as encaminha para a aplicação correta no servidor. Com ele, você roda várias aplicações — cada uma em sua porta interna — atrás das portas 80 e 443, com SSL centralizado.
Por que usar
- Vários domínios/aplicações no mesmo VPS;
- SSL em um só lugar;
- Aplicações escutando apenas no localhost, invisíveis para a internet;
- Cache, compressão, rate limiting e cabeçalhos de segurança centralizados;
- Base para balanceamento de carga.
Opção 1: Nginx
Ótimo para aplicações instaladas diretamente no sistema ou em containers com portas fixas.
Exemplo: duas aplicações
# /etc/nginx/sites-available/apps
server {
listen 80;
server_name app1.seudominio.com.br;
location / {
proxy_pass http://127.0.0.1:3000;
include /etc/nginx/snippets/proxy.conf;
}
}
server {
listen 80;
server_name app2.seudominio.com.br;
location / {
proxy_pass http://127.0.0.1:8080;
include /etc/nginx/snippets/proxy.conf;
}
}
Snippet reutilizável
# /etc/nginx/snippets/proxy.conf
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
O cabeçalho
Connection "upgrade"fixo funciona bem para WebSockets. Para produção com muito tráfego, prefira usar ummap $http_upgrade $connection_upgradee reaproveitar conexões.
sudo ln -s /etc/nginx/sites-available/apps /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app1.seudominio.com.br -d app2.seudominio.com.br
Opção 2: Traefik
Feito para containers: descobre serviços automaticamente pelos labels do Docker e emite certificados Let's Encrypt sozinho.
compose.yaml do Traefik
services:
traefik:
image: traefik:v3.1
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --certificatesresolvers.le.acme.email=seu@email.com
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- proxy
networks:
proxy:
name: proxy
Use a versão estável mais recente do Traefik indicada na documentação oficial.
Publicando uma aplicação
services:
app:
image: minha-app:latest
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.seudominio.com.br`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
- traefik.http.services.app.loadbalancer.server.port=3000
networks:
- proxy
networks:
proxy:
external: true
Suba o container e, em instantes, a aplicação estará em HTTPS — sem publicar portas no host.
Montar o
docker.sockdá ao Traefik amplo acesso ao Docker. Use montagem somente leitura e, em ambientes sensíveis, considere um socket proxy.
Nginx ou Traefik?
| Critério | Nginx | Traefik |
|---|---|---|
| Aplicações fora de containers | Excelente | Possível (arquivo de configuração) |
| Containers Docker | Bom (configuração manual) | Excelente (automático) |
| SSL automático | Via Certbot | Integrado |
| Arquivos estáticos e cache | Excelente | Limitado |
| Configuração | Arquivos de texto | Labels/YAML |
Uma alternativa simples é o Caddy, que também tem SSL automático e configuração enxuta.
Conclusão
Com um proxy reverso, um único VPS vira uma plataforma para várias aplicações, todas com HTTPS. Monte a sua em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.