Base de Conhecimento

Nginx proxy reverso: como configurar na sua VPS

  • nginx proxy reverso, nginx, proxy_pass, vps, tutorial
  • Usuários acharam útil: 0

Aprenda a configurar o Nginx como proxy reverso na VPS: bloco mínimo, cabeçalhos, a barra do proxy_pass, WebSocket, tempo limite, HTTPS e vários apps.

Por Redação Eleven Host · @robson.direitodigital · 27 de outubro de 2026 · 9 min de leitura

Arte da Eleven Host: janela de terminal com o título: Nginx proxy reverso: como configurar na sua VPS

Capa da Redação Eleven Host para o guia: Nginx proxy reverso: como configurar na sua VPS Arte: Eleven Host

O nginx proxy reverso recebe a visita na porta 80 ou 443 e repassa o pedido para um app que roda numa porta interna da VPS, como um Node.js na 3000. O visitante só vê o seu domínio, sem ver a porta do app.

Este guia mostra como configurar o Nginx proxy reverso na VPS: instalar, escrever o bloco mínimo, entender cada cabeçalho, ligar o WebSocket, ajustar o tempo limite e pôr HTTPS. Os comandos valem para Ubuntu, e os nomes (seudominio.com.br, meu-app, a porta 3000) são exemplos: troque pelos seus.

O que é um proxy reverso e quando usar

Pense no Nginx como a recepção de um prédio. A visita chega à recepção (portas 80 e 443), diz com quem quer falar, e a recepção a encaminha ao apartamento certo, que é o app numa porta interna. Quem chegou não precisa saber o número do apartamento.

Esse arranjo serve em situações como estas:

  • Você tem um app em Node.js na porta 3000, um container na 8080 ou o n8n na 5678 e quer abri-los pelo domínio.
  • Você quer vários apps na mesma VPS, cada um num domínio ou subdomínio.
  • Você quer colocar o HTTPS num lugar só, em vez de configurar certificado em cada app.
  • Você não quer expor a porta do app para a internet.

Instalar o Nginx e achar o arquivo de configuração

No Ubuntu, a instalação são dois comandos, e o terceiro confere se o serviço está ativo:

sudo apt update

sudo apt install nginx

systemctl status nginx

No padrão do Ubuntu e do Debian, cada site tem um arquivo em /etc/nginx/sites-available/, e você o ativa com um link em sites-enabled. Crie o arquivo do seu app com o editor de sua preferência, por exemplo sudo nano /etc/nginx/sites-available/meu-app, e ative assim:

sudo ln -s /etc/nginx/sites-available/meu-app /etc/nginx/sites-enabled/

O bloco mínimo do proxy reverso, linha a linha

Este é o conteúdo do arquivo meu-app. Troque o domínio e a porta pelos do seu app:

server {

    listen 80;

    server_name seudominio.com.br www.seudominio.com.br;

    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;

    }

}

O que cada linha faz:

  • listen 80; escuta a porta 80, a do HTTP.
  • server_name diz a quais domínios este bloco responde.
  • location / vale para os endereços do site.
  • proxy_pass é o destino: o app em 127.0.0.1, a própria VPS, na porta 3000.
  • proxy_http_version 1.1; declara a versão do HTTP usada com o app. Segundo a documentação do Nginx, o padrão passou a ser 1.1 só na versão 1.29.7, e antes era 1.0. Como a versão instalada pode ser mais antiga, declarar a linha é o caminho seguro, e o WebSocket também exige.

Por que cada proxy_set_header

A documentação do Nginx explica que, por padrão, ele não repassa o cabeçalho Host do visitante: envia o endereço do proxy_pass. Por isso as linhas abaixo existem:

  • Host $host: o app fica sabendo qual domínio foi pedido.
  • X-Real-IP $remote_addr e X-Forwarded-For $proxy_add_x_forwarded_for: sem eles, o app enxerga todas as visitas vindo de 127.0.0.1
  • X-Forwarded-Proto $scheme: o app sabe se a visita chegou por http ou https.

O cifrão em $host é parte do Nginx (uma variável), não precisa trocar nada.

Testar e aplicar a configuração

Antes de aplicar, peça ao Nginx que confira o arquivo. Só se o teste passar, recarregue:

sudo nginx -t

sudo systemctl reload nginx

O reload aplica a nova configuração. Se o app estiver rodando na porta 3000, abra o domínio no navegador e a página dele deve aparecer.

Rode sudo nginx -t a cada mudança, antes do reload. O teste confere o arquivo antes de você aplicar a mudança.

A barra no proxy_pass

Este é um detalhe que gera 404 com facilidade. Segundo a documentação, quando o proxy_pass não tem caminho (como http://127.0.0.1:3000;), o endereço pedido segue como veio. Quando tem caminho, mesmo que seja só uma barra, a parte que casou com o location é trocada por esse caminho. Veja um exemplo:

location /app/ {

    proxy_pass http://127.0.0.1:3000/;

}

Aqui, o pedido /app/pagina chega ao app como /pagina. Sem a barra final no proxy_pass, o app receberia /app/pagina. Se o app abre na raiz mas dá 404 pelo caminho com prefixo, confira se há barra a mais ou a menos nessas duas linhas.

WebSocket: chat, painéis em tempo real e n8n

Apps que mantêm uma conexão aberta, como chats, painéis em tempo real e o editor do n8n, usam WebSocket e pedem uma configuração a mais, descrita na documentação do Nginx. Primeiro o map, que fica fora do server. Num arquivo de sites-enabled, pode ficar no topo, antes do server:

map $http_upgrade $connection_upgrade {

    default upgrade;

    '' close;

}

Depois, dentro do location, acrescente estas três linhas ao bloco que você já tem:

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection $connection_upgrade;

Teste com sudo nginx -t e recarregue como antes.

Tempo limite: o erro 504 e o WebSocket que cai

Pela documentação, o proxy_read_timeout vale 60 segundos por padrão. Ele mede o intervalo entre duas leituras, não a resposta inteira. O proxy_connect_timeout também é de 60 segundos. Duas consequências práticas:

  • Um relatório ou uma exportação que fique mais de 60 segundos sem enviar dados pode terminar em erro 504.
  • Um WebSocket parado por 60 segundos sem trafegar dados é fechado.

Para aumentar o prazo de leitura, acrescente no location:

proxy_read_timeout 300s;

No caso do WebSocket, outra saída é o próprio app enviar um "ping" de tempos em tempos para manter a conexão ativa.

Quer rodar seus apps num servidor seu? Os planos de VPS são a partir de R$ 17,00/mês, no Plano Bronze; confira na loja o que cada plano inclui. Ver planos de VPS

HTTPS com certbot

Deixe o site funcionando na porta 80 primeiro e só depois ponha o certificado. O domínio precisa já apontar para a VPS; se ainda não apontou, siga o guia Apontar domínio para VPS: passo a passo com registro A. Com o domínio apontado, instale o certbot com o plugin do Nginx e peça o certificado:

sudo apt install certbot python3-certbot-nginx

sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.br

Ao terminar, rode sudo nginx -t e abra o domínio com https para conferir.

Vários apps na mesma VPS, um por subdomínio

Para cada domínio ou subdomínio, crie um bloco server com o seu server_name e o seu proxy_pass. Por exemplo, app.seudominio.com.br pode apontar para a porta 3000 e n8n.seudominio.com.br para a 5678. Cada subdomínio precisa do seu registro no DNS apontando para a VPS.

Organize um arquivo por app em sites-available. Assim, para desligar um app, você remove só o link dele em sites-enabled e recarrega o Nginx.

Segurança: deixe o app só em 127.0.0.1

Se o app escuta em 0.0.0.0, outras pessoas podem abri-lo direto pela porta, passando por fora do Nginx e do HTTPS. Configure o app para escutar só em 127.0.0.1. Com Docker, publique a porta assim: -p 127.0.0.1:8080:80; para instalar o Docker, veja o guia Instalar Docker na VPS Ubuntu: passo a passo seguro.

Complete com o firewall liberando apenas as portas 80 e 443 e o SSH. O passo a passo está em Firewall para VPS: como proteger seu servidor.

Erro 502: onde olhar

O 502 significa que o Nginx não conseguiu falar com o app, seja porque o app está parado ou porque a porta do proxy_pass está errada. Veja o registro de erros do Nginx:

sudo tail -n 50 /var/log/nginx/error.log

Depois confira se o app está de pé e se a porta bate com a do arquivo. O guia Erro 502 Bad Gateway: o que é e como resolver na VPS traz o passo a passo completo.

Checklist do proxy reverso

  • O app responde na porta interna e escuta só em 127.0.0.1.
  • O domínio aponta para a VPS.
  • O arquivo está em sites-available e o link existe em sites-enabled.
  • O proxy_pass tem a barra certa, e o Host e os cabeçalhos X-Forwarded estão no location.
  • Se o app usa WebSocket, o map e as três linhas do Upgrade estão no lugar.
  • O proxy_read_timeout foi ajustado se há tarefas longas.
  • Rodei sudo nginx -t e depois sudo systemctl reload nginx.
  • O certificado foi emitido com o certbot.
  • O firewall libera só 80, 443 e SSH.

Registre o domínio da sua empresa; para domínios registrados na Eleven Host, o DNS gerenciado na rede da Cloudflare é grátis, com painel na área do cliente. Registrar domínio

Perguntas frequentes

O que é um proxy reverso no Nginx?

É o Nginx recebendo a visita nas portas 80 e 443 e repassando o pedido a um app que roda numa porta interna. O visitante só vê o domínio.

Preciso de proxy reverso para colocar um app Node.js no ar?

Ele é uma forma de abrir o app pelo domínio, com HTTPS e vários apps na mesma VPS. Você pode expor a porta do app direto, mas perde esses benefícios e deixa a porta acessível de fora.

Por que recebo 404 depois de usar proxy_pass com caminho?

Porque, quando o proxy_pass tem caminho, a parte que casou com o location é trocada por ele. Confira a barra no final nas duas linhas.

Por que o WebSocket cai depois de um minuto?

O proxy_read_timeout padrão é de 60 segundos. Aumente o valor no location ou faça o app enviar um "ping".

Como instalo o certificado HTTPS?

Com o domínio apontado para a VPS, instale certbot e python3-certbot-nginx e rode sudo certbot --nginx -d seudominio.com.br.

Esta resposta lhe foi útil?

Artigos Relacionados