Proxy reverso Nginx num VPS Linux

3 min
Alojamento VPS/VDS

Um proxy reverso recebe o tráfego público nas portas 80 e 443 e encaminha-o para aplicações que só escutam localmente. Traz HTTPS, vários sites num único IP e um ponto único para registos e limites. Este guia configura-o num VPS Linux Infrawire para aplicações Node.js, Python ou Docker.

📋 Pré-requisitos

  • Um VPS Linux (Ubuntu 24.04 / Debian 12 ou AlmaLinux 9 / Rocky 9) com acesso SSH root. O IP e a palavra-passe root estão na sua área de cliente.
  • Um domínio example.com com registos A/AAAA a apontar para VPS_IP.
  • Uma aplicação a escutar numa porta local, por exemplo 127.0.0.1:3000.

📦 Instalar o Nginx

Bash
# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx

No AlmaLinux/Rocky, o SELinux impede por defeito o Nginx de se ligar a backends. Autorize-o uma vez:

Bash
sudo setsebool -P httpd_can_network_connect 1

🚀 Uma primeira aplicação atrás do proxy

A sua aplicação deve escutar em 127.0.0.1 e não em 0.0.0.0, para só ser acessível através do Nginx. Seja qual for a linguagem, o padrão é o mesmo: node server.js na porta 3000, gunicorn -b 127.0.0.1:8000 app:app para Python, ou um contentor publicado com docker run -d -p 127.0.0.1:3000:80 IMAGE.

Crie /etc/nginx/sites-available/example.com (no AlmaLinux/Rocky use /etc/nginx/conf.d/example.com.conf):

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}

Ative-o no Debian/Ubuntu, depois valide e recarregue:

Bash
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

Os cabeçalhos X-Forwarded-* permitem à aplicação conhecer o IP real do cliente e saber se o visitante usou HTTPS. Sem eles, a sua app só vê 127.0.0.1 e pode gerar ligações http://. Muitas frameworks também precisam de ser configuradas para confiar no proxy (por exemplo app.set('trust proxy', 1) no Express).

🔌 Suporte a WebSocket

O WebSocket precisa dos cabeçalhos de upgrade HTTP. Adicione um map no início do contexto http (por exemplo em /etc/nginx/conf.d/websocket.conf):

Nginx
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

Depois, no bloco location:

Nginx
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;

⏱️ Timeouts e tamanho do corpo

Os valores por defeito são 60 segundos e 1 MB. Ajuste-os para endpoints lentos ou envios de ficheiros:

Nginx
proxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;

Para um WebSocket de longa duração, aumente proxy_read_timeout (por exemplo 3600s) ou faça a aplicação enviar pings.

🔒 HTTPS com Certbot

Abra primeiro a firewall para 80 e 443 e depois:

Bash
# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com

No AlmaLinux/Rocky, instale o Certbot com sudo dnf install -y epel-release e depois sudo dnf install -y certbot python3-certbot-nginx. O Certbot adiciona o certificado ao seu bloco server, propõe o redirecionamento de HTTP para HTTPS e instala a renovação automática. Verifique-a com:

Bash
sudo certbot renew --dry-run

🗂️ Várias aplicações num VPS

Crie um bloco server por domínio, cada um com o seu server_name e a sua porta local:

Nginx
1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}

Repita os cabeçalhos de proxy em cada bloco e execute o Certbot com -d app1.example.com -d app2.example.com. Também pode separar por caminho (location /api/ { proxy_pass http://127.0.0.1:8000/; }); a barra final remove então o prefixo.

✅ Testar

Bash
curl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log

A porta do backend deve estar associada apenas a 127.0.0.1, enquanto o Nginx escuta em 80 e 443.

🛠️ Resolução de problemas

502 Bad Gateway. A aplicação está parada ou noutra porta. Verifique com ss -ltnp e arranque-a. No AlmaLinux/Rocky, um Permission denied no registo de erros indica que falta o booleano SELinux acima.

504 Gateway Timeout. O backend demora mais do que proxy_read_timeout. Aumente-o ou otimize o endpoint.

O WebSocket desliga ou falha com 400/426. Faltam os cabeçalhos Upgrade e Connection, ou não existe proxy_http_version 1.1;.

IP de cliente errado nos logs. O X-Forwarded-For é enviado mas a sua aplicação não confia no proxy. Ative a definição de confiança da sua framework.


🎉 As suas aplicações são agora servidas atrás do Nginx com HTTPS, cabeçalhos limpos e espaço para tantos sites quantos o seu VPS aguentar.

Fique a par das últimas ofertas, descontos e promoções especiais.

Ver promoções

Utilizamos cookies

Utilizamos cookies analíticos para melhorar a sua experiência no nosso site. Nenhum dado é vendido a terceiros. Saiba mais na nossa política de privacidade.