No artigo anterior vimos como o Nginx funciona internamente e por que sua arquitetura orientada a eventos o torna eficiente para alto tráfego. Agora é hora de colocar a mão na massa.
Neste artigo você vai instalar o Nginx, criar a estrutura de diretórios do site, escrever um arquivo de configuração versionável e subir o serviço em produção. Cada comando tem um motivo — e vamos explicar cada um deles.
Pré-requisitos
- Ubuntu 22.04 ou Debian 12 (os comandos são os mesmos)
- Acesso SSH ao servidor com permissões sudo
- Um domínio apontando para o IP do servidor (ou use o IP diretamente para testes)
1. Instalar o Nginx
sudo apt update
sudo apt install nginx -y
Verifique se a instalação funcionou:
nginx -v
# nginx version: nginx/1.24.0
O systemd já registra o Nginx como serviço automaticamente. Habilite a inicialização automática no boot:
sudo systemctl enable nginx
2. Entender a estrutura de arquivos
Após a instalação, o Nginx cria a seguinte estrutura em /etc/nginx/:
/etc/nginx/
├── nginx.conf # arquivo principal
├── sites-available/ # configs de sites (inativos por padrão)
├── sites-enabled/ # symlinks para os sites ativos
├── conf.d/ # configs adicionais carregadas automaticamente
├── snippets/ # trechos reutilizáveis
└── modules-enabled/ # módulos carregados
O arquivo principal /etc/nginx/nginx.conf usa include para carregar tudo que estiver em sites-enabled/ e conf.d/. Essa convenção é prática, mas não é obrigatória — você pode apontar o include para qualquer caminho no servidor, inclusive para dentro do seu repositório.
3. Criar a estrutura de diretórios do site
sudo mkdir -p /var/www/meusite.com/html
sudo mkdir -p /var/www/meusite.com/logs
sudo mkdir -p /var/www/meusite.com/infra
# Define o dono dos arquivos para o seu usuário
sudo chown -R $USER:$USER /var/www/meusite.com/html
sudo chown -R $USER:$USER /var/www/meusite.com/infra
# Permissões corretas para o diretório web
sudo chmod -R 755 /var/www/meusite.com
Crie um index.html para testar:
echo "<h1>meusite.com funcionando!</h1>" > /var/www/meusite.com/html/index.html
4. O arquivo de configuração versionado
Em vez de colocar a config em sites-available/, vamos mantê-la dentro do próprio diretório do projeto em infra/nginx.conf. Isso tem uma vantagem importante: o arquivo pode ser versionado no repositório Git e atualizado automaticamente no deploy, sem precisar acessar o servidor manualmente.
Crie o arquivo:
nano /var/www/meusite.com/infra/nginx.conf
Conteúdo:
server {
listen 80;
listen [::]:80;
server_name meusite.com www.meusite.com;
root /var/www/meusite.com/html;
index index.html;
access_log /var/www/meusite.com/logs/access.log;
error_log /var/www/meusite.com/logs/error.log;
# Esconde a versão do Nginx nas respostas HTTP
server_tokens off;
# Compressão gzip para texto, CSS e JavaScript
gzip on;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
gzip_min_length 256;
# Serve arquivos estáticos; fallback para index.html (útil para SPAs)
location / {
try_files $uri $uri/ /index.html;
}
# Cache de longa duração para assets com hash no nome
location ~* \.(css|js|png|jpg|jpeg|svg|ico|woff2|webp)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Nota sobre SPAs: o
try_files $uri $uri/ /index.htmlfaz com que qualquer rota não encontrada devolva oindex.html. Isso é necessário para React, Vue e Angular funcionarem com roteamento no cliente. Se o seu site não é uma SPA, substitua/index.htmlpor=404para retornar erro corretamente.
5. Ativar a configuração no Nginx principal
Edite o arquivo principal do Nginx para incluir o arquivo do seu projeto:
sudo nano /etc/nginx/nginx.conf
Dentro do bloco http { }, adicione a linha de include:
http {
# ... outras diretivas existentes ...
# Inclui a config versionada do projeto
include /var/www/meusite.com/infra/nginx.conf;
}
Se o site padrão ainda estiver ativo, remova o symlink para evitar conflito:
sudo rm -f /etc/nginx/sites-enabled/default
Por que include e não sites-available? A convenção
sites-available/sites-enabledé apenas isso — uma convenção. O Nginx lê qualquer arquivo referenciado porinclude. Manter a config no repositório do projeto significa que ela pode ser atualizada viagit push+ deploy automático, sem acesso manual ao servidor. A parte 3 desta série mostra exatamente como fazer isso com GitHub Actions.
---
6. Testar a configuração antes de aplicar
Nunca pule esse passo. Um erro de sintaxe no arquivo de config derruba o Nginx ao tentar recarregar.
sudo nginx -t
Se estiver tudo certo:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Se houver erro, o output vai indicar o arquivo e a linha. Corrija antes de continuar.
7. Iniciar o serviço
sudo systemctl restart nginx
sudo systemctl status nginx
A saída deve mostrar active (running). Acesse o IP do servidor no navegador para confirmar.
8. Liberar o firewall
Se o servidor usar ufw, libere as portas HTTP e HTTPS:
sudo ufw allow 'Nginx Full'
sudo ufw status
---
9. Monitorar os logs
Com o servidor rodando, acompanhe as requisições em tempo real:
# Requisições recebidas
sudo tail -f /var/www/meusite.com/logs/access.log
# Erros (problemas de config, arquivos não encontrados, etc.)
sudo tail -f /var/www/meusite.com/logs/error.log
Comandos úteis do dia a dia
# Recarrega config sem derrubar conexões ativas (use após editar nginx.conf)
sudo systemctl reload nginx
# Reinicia completamente
sudo systemctl restart nginx
# Para e inicia o serviço
sudo systemctl stop nginx
sudo systemctl start nginx
# Vê os logs do sistema (inclui falhas na inicialização)
sudo journalctl -u nginx --no-pager -n 50
# Lista todos os includes ativos
sudo nginx -T | grep include
Próximo artigo
Com o servidor configurado e rodando, a próxima etapa é automatizar o deploy. Na parte 3 desta série, vamos configurar o GitHub Actions para enviar o código e recarregar o Nginx automaticamente a cada git push, e adicionar HTTPS com certificado gratuito via Certbot.
Referências: