O Nginx e um dos reverse proxies mais amplamente implantados no mundo. Seja roteando tráfego para um backend Node.js, balanceando carga entre múltiplos servidores de aplicação ou terminando SSL na frente de um container Docker, o Nginx lida com tudo com uso mínimo de recursos e performance excepcional.
O Que É um Reverse Proxy?
Um reverse proxy fica entre clientes (navegadores) e seus servidores backend. Em vez dos clientes se conectarem diretamente à sua aplicação, eles se conectam ao Nginx, que encaminha a requisição para o backend apropriado.
Benefícios de usar um reverse proxy:
- Terminação SSL — Gerenciar HTTPS no nível do proxy
- Balanceamento de carga — Distribuir tráfego entre múltiplas instâncias
- Cache — Servir conteúdo frequentemente requisitado sem acessar o backend
- Segurança — Ocultar detalhes do servidor backend
- Compressão — Comprimir respostas antes de enviar aos clientes
- Logging centralizado — Agregar logs de acesso em um só lugar
Configuração Básica de Reverse Proxy
server {
listen 80;
server_name app.knowledgexchange.xyz;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
Terminação SSL
server {
listen 443 ssl http2;
server_name app.knowledgexchange.xyz;
ssl_certificate /etc/letsencrypt/live/app.knowledgexchange.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.knowledgexchange.xyz/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
location / {
proxy_pass http://127.0.0.1:3000;
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 WebSocket
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
Balanceamento de Carga
upstream backend_pool {
least_conn;
server 10.0.1.10:3000;
server 10.0.1.11:3000;
server 10.0.1.12:3000;
}
server {
listen 80;
server_name app.knowledgexchange.xyz;
location / {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Rate Limiting
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_req_status 429;
proxy_pass http://127.0.0.1:3000;
}
}
Considerações de Segurança
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
client_max_body_size 10m;
client_body_timeout 10s;
Testando Sua Configuração
sudo nginx -t
sudo systemctl reload nginx
sudo tail -f /var/log/nginx/error.log
Conclusão
O Nginx como reverse proxy fornece uma camada confiável e de alta performance entre seus usuários e suas aplicações backend. Comece com uma configuração básica de proxy_pass, depois adicione terminação SSL, cache, rate limiting e balanceamento de carga conforme suas necessidades crescem.