Como Instalar e Configurar Nginx no Ubuntu em uma VPS
Guia prático para instalar e configurar Nginx no Ubuntu em uma VPS — server blocks, firewall UFW, HTTPS com Let's Encrypt e tuning básico.
Nginx é o servidor web mais usado em VPS Linux por um motivo: footprint baixo (uns 5-10 MB de RAM em idle), modelo event-driven que aguenta milhares de conexões simultâneas com poucos workers, e configuração declarativa que cresce bem desde um site estático até proxy reverso de microserviços. Mas instalação só com apt install nginx deixa a maior parte do trabalho real por fazer — server blocks padrão, sem HTTPS, firewall desconfigurado.
Este tutorial cobre a sequência completa pra ter uma VPS Ubuntu servindo um site (estático ou aplicação) com Nginx em produção: instalação, server block por domínio, firewall UFW, certificado HTTPS via Let’s Encrypt e ajustes mínimos de performance. Persona: developer que vai colocar uma aplicação ou site estático no ar e quer um setup limpo e auditável, não um copia-e-cola que esconde decisões.
Tempo estimado: 25-35 minutos, contando propagação de DNS se você ainda não apontou o domínio.
Pré-requisitos
Uma VPS com Ubuntu 24.04 LTS (ou 22.04 LTS) instalado, acesso SSH com usuário sudo, IP público fixo e um domínio com registro A apontando pra esse IP. Reserve pelo menos 512 MB de RAM livres — o Nginx em si consome pouco, mas o Certbot e a aplicação por trás somam.
Ubuntu 24.04 LTS SSH + sudo 22, 80, 443 A record no IP da VPS Confirme antes de continuar que o domínio resolve corretamente. Em outra máquina, rode dig +short seudominio.com.br — a resposta deve ser exatamente o IP da sua VPS. Se demorou pra apontar, espere a propagação completar antes de tentar emitir certificado, porque cada falha do Let’s Encrypt conta no rate limit semanal.
Instalação do Nginx
A primeira etapa é instalar o pacote e validar que o serviço sobe corretamente. O Ubuntu vem com o Nginx empacotado e integrado ao systemd, então o ciclo é direto.
Atualize o índice de pacotes do APT pra garantir que você instala a versão mais recente disponível no repositório:
sudo apt updateEsse comando lê os repositórios configurados em /etc/apt/sources.list e baixa os manifestos atualizados. Sem isso, você pode acabar instalando uma versão desatualizada com vulnerabilidades já corrigidas em releases novos.
Instale o Nginx:
sudo apt install -y nginxO instalador configura automaticamente o service systemd, cria a estrutura em /etc/nginx/ e inicia o processo. A flag -y aceita prompts automaticamente — em ambientes interativos você pode omitir.
Verifique que o serviço está ativo:
sudo systemctl status nginxA saída deve mostrar Active: active (running) em verde. Se estiver failed, rode sudo journalctl -u nginx -n 50 pra ver o erro real — normalmente é conflito de porta (Apache rodando, por exemplo) ou erro de sintaxe num arquivo de config.
Se a VPS veio com Apache pré-instalado (algumas imagens trazem), pare e desabilite ele antes: sudo systemctl stop apache2 && sudo systemctl disable apache2. Duas aplicações não podem fazer bind na porta 80 simultaneamente.
Configuração do firewall UFW
Antes de expor portas, configure o firewall. O UFW (Uncomplicated Firewall) vem instalado no Ubuntu e usa perfis nomeados pra simplificar regras comuns.
Liste os perfis disponíveis pro Nginx:
sudo ufw app listVocê verá Nginx Full, Nginx HTTP e Nginx HTTPS. O perfil “Full” abre 80 e 443 — é o que você quer pra um servidor web completo.
Permita SSH (caso ainda não esteja permitido) e o tráfego web, depois ative o firewall:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enableA ordem importa: libere SSH antes de habilitar o UFW. Caso contrário, você é desconectado e fica trancado fora da VPS.
Nunca rode sudo ufw enable sem antes liberar a porta SSH. Se acontecer e você perder acesso, a maioria dos provedores oferece console serial ou recuperação via painel — pela Hostini, o console KVM no painel da VPS resolve.
Server blocks para múltiplos domínios
Server blocks (equivalente a virtual hosts do Apache) permitem servir mais de um site na mesma VPS, cada um com seu domínio e raiz de arquivos separada. Mesmo que você tenha um site só por enquanto, configurar via server block facilita expansão depois.
Crie a pasta raiz pro seu domínio e ajuste permissões:
sudo mkdir -p /var/www/seudominio.com.br/html
sudo chown -R $USER:$USER /var/www/seudominio.com.br/html
sudo chmod -R 755 /var/www/seudominio.com.brA propriedade fica no seu usuário pra você poder fazer deploy sem sudo toda hora. O Nginx (rodando como www-data) só precisa de read access — 755 resolve.
Crie um index.html simples pra teste:
echo "<h1>Funcionou</h1>" > /var/www/seudominio.com.br/html/index.htmlCrie o server block em /etc/nginx/sites-available/seudominio.com.br:
server {
listen 80;
listen [::]:80;
root /var/www/seudominio.com.br/html;
index index.html index.htm;
server_name seudominio.com.br www.seudominio.com.br;
location / {
try_files $uri $uri/ =404;
}
}A diretiva try_files tenta servir o arquivo pedido, depois trata como diretório, e finalmente retorna 404 — pattern padrão pra conteúdo estático. Pra aplicações Node/Python/PHP, você troca essa parte por proxy_pass ou fastcgi_pass.
Ative o site criando um symlink em sites-enabled e desative o default:
sudo ln -s /etc/nginx/sites-available/seudominio.com.br /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/defaultO Nginx no Ubuntu carrega tudo que está em sites-enabled. Deixar o default ativo causa conflito de server_name e o Nginx escolhe um dos dois arbitrariamente.
Teste a sintaxe e recarregue:
sudo nginx -t
sudo systemctl reload nginxnginx -t valida a config inteira sem aplicar — sempre rode antes de reload. Se passar, o reload é zero-downtime: workers antigos terminam suas requests enquanto novos sobem.
HTTPS com Let’s Encrypt
Sem HTTPS hoje você perde SEO, ranking em qualquer navegador moderno mostra “Não seguro”, e formulários quebram. O Certbot do projeto Let’s Encrypt automatiza emissão e renovação gratuita.
Instale o Certbot e o plugin do Nginx:
sudo apt install -y certbot python3-certbot-nginxO plugin lê seus server blocks, detecta os domínios e ajusta as diretivas SSL automaticamente — você não precisa editar nginx.conf manualmente.
Emita o certificado:
sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.brO Certbot pede e-mail (pra avisos de expiração), aceita o ToS, e oferece redirecionar HTTP pra HTTPS automaticamente — escolha “redirect” (opção 2). A validação acontece via desafio HTTP-01 na porta 80, então confirme que o firewall e o DNS estão certos antes.
O pacote do Certbot já instala um timer systemd (certbot.timer) que renova certificados próximos do vencimento. Verifique com sudo systemctl list-timers | grep certbot. Não há nada a configurar — a renovação roda sozinha duas vezes por dia.
Verificação
Confirme que tudo está no ar. Abra https://seudominio.com.br no navegador — deve carregar a página de teste com cadeado verde. Pela linha de comando, valide o handshake TLS e os headers:
curl -I https://seudominio.com.br
A resposta esperada começa com HTTP/2 200 (Certbot habilita HTTP/2 por padrão) e inclui server: nginx/1.x.x. Se aparecer HTTP/1.1, sua configuração não tem http2 ativo — adicione em listen 443 ssl http2; no server block.
Para inspecionar o certificado em si:
echo | openssl s_client -connect seudominio.com.br:443 -servername seudominio.com.br 2>/dev/null | openssl x509 -noout -dates -issuer
Você verá notBefore e notAfter (validade de 90 dias) e o issuer “Let’s Encrypt”.
Tuning básico para produção
A config default do Nginx funciona, mas vale ajustar três parâmetros antes de receber tráfego real. Edite /etc/nginx/nginx.conf:
- worker_processes auto; — usa um worker por core de CPU automaticamente. Já vem como
autoem versões recentes, confirme. - worker_connections 4096; — eleva o limite de conexões simultâneas por worker (default 768 é conservador). Em VPS pequenas com pouca RAM, mantenha 1024.
- keepalive_timeout 30; — reduzir de 65s pra 30s libera workers mais rápido em workloads HTTP curtos.
Depois de editar, rode sudo nginx -t && sudo systemctl reload nginx.
Em sites com CSS/JS pesado, habilite gzip on; (já vem ativo no Ubuntu) e adicione expires 30d; num location block pra arquivos estáticos. Combinado com HTTP/2, reduz tempo de carregamento em 30-50% sem mudar nada na aplicação.
Próximos passos
Com o Nginx no ar e servindo HTTPS, próximos movimentos comuns:
- Proxy reverso pra Node/Python/Go — substitua o
try_filesporproxy_pass http://127.0.0.1:3000;apontando pra sua aplicação rodando em porta interna. - HTTP/3 (QUIC) — requer Nginx 1.25+ compilado com TLS adequado; avalie se o ganho de latência justifica sair do pacote oficial do Ubuntu.
- Rate limiting —
limit_req_zoneprotege contra abuso em endpoints sensíveis (login, APIs públicas). - Logs estruturados (JSON) — facilita ingestão em ferramentas de observabilidade. Configure via
log_formatcustom. - Backup do
/etc/nginx/— versionar suas configs num repositório Git privado evita perder horas reconstruindo após uma reinstalação.
Se você está colocando isso em produção, uma VPS Hostini já vem com Ubuntu LTS, IP IPv4 dedicado e console KVM no painel — útil quando você se tranca fora editando regras de firewall e precisa recuperar acesso sem abrir ticket.
Perguntas frequentes
Qual a diferença entre Nginx do apt e Nginx do repositório oficial nginx.org?
O pacote do Ubuntu (`nginx`) é estável e bem integrado ao systemd, mas costuma estar 1-2 minor versions atrás. O repositório oficial nginx.org entrega releases mais novos (mainline ou stable) com módulos adicionais e atualizações de segurança mais rápidas. Para produção sem necessidades específicas, o pacote do Ubuntu basta. Para HTTP/3, módulos dinâmicos novos ou TLS 1.3 features recentes, prefira o repositório oficial.
Preciso parar o Apache antes de instalar o Nginx?
Sim, se o Apache estiver rodando e ouvindo na porta 80 ou 443. Rode `sudo systemctl stop apache2 && sudo systemctl disable apache2` antes de iniciar o Nginx — duas aplicações não podem fazer bind na mesma porta. Se você quer manter ambos, configure o Apache em porta interna (8080) e use Nginx como proxy reverso na frente.
Onde fica o log de erro do Nginx quando algo quebra?
Por padrão em `/var/log/nginx/error.log` (global) e em `error_log` específico de cada server block, se você configurou. Para falhas de startup que nem chegam no log, use `sudo journalctl -u nginx -n 50` — captura o stderr do processo antes do Nginx abrir os arquivos de log.
Como recarrego a configuração sem reiniciar o Nginx e derrubar conexões?
Use `sudo systemctl reload nginx` (ou `sudo nginx -s reload`). O master process valida a nova config, spawna workers novos com ela e mata os antigos só depois que terminam as requests em andamento. Reinício completo (`restart`) só é necessário em mudanças de binário ou módulos.
Por que o Certbot pede e-mail e domínio aponta corretamente mas falha com 'unauthorized'?
Quase sempre é problema de DNS ou firewall. O Let's Encrypt precisa fazer HTTP GET no seu IP via porta 80 a partir dos servidores deles. Verifique: (1) o A/AAAA record aponta pro IP da VPS — `dig +short seudominio.com.br`; (2) a porta 80 está liberada no UFW E no firewall do provedor; (3) nenhum proxy/CDN intermedia a validação (desative Cloudflare proxy temporariamente).
Vale a pena ativar HTTP/2 ou HTTP/3 no Nginx?
HTTP/2 sim, sempre — habilite com `listen 443 ssl http2;`. Reduz latência em sites com múltiplos assets via multiplexing em uma única conexão TCP. HTTP/3 (QUIC) traz ganhos em redes instáveis (mobile, conexões com perda) mas exige Nginx 1.25+ compilado com BoringSSL ou quictls — o pacote padrão do Ubuntu não inclui. Avalie caso a caso.