Cloud & Infraestrutura • 5 min de leitura

Nginx na prática: instalação, configuração e servidor rodando

Nginx na prática: instalação, configuração e servidor rodando

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.html faz com que qualquer rota não encontrada devolva o index.html. Isso é necessário para React, Vue e Angular funcionarem com roteamento no cliente. Se o seu site não é uma SPA, substitua /index.html por =404 para 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 por include. Manter a config no repositório do projeto significa que ela pode ser atualizada via git 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: