[Nginx] Guia de Aprendizado Nginx

Sumário

  1. O que é Nginx?

  2. Instalação e Inicialização

  3. Detalhamento do Arquivo de Configuração

  4. Implementação de Funcionalidades Essenciais

  5. Casos de Configuração Comuns

  6. Solução de Problemas

  7. Otimização de Desempenho

  8. Referência Rápida

  9. O que é Nginx?


1.1 Compreensão Básica

Nginx é um servidor Web de alto desempenho e um servidor proxy reverso, utilizado principalmente para:

  • Serviço de arquivos estáticos: Fornecimento rápido de HTML, imagens, CSS e arquivos JS
  • Proxy reveerso: Encaminhamento de requisições para servidores de aplicação backend (como Node.js, PHP, Python)
  • Balanceamento de carga: Distribuição de tráfego entre múltiplos servidores backend

1.2 Comparação com Apache

Característica Nginx Apache
Desempenho Extremo alto (100k+ concorrência) Médio
Uso de memória Muito baixo (2MB) Allto
Arquivos estáticos Excelente Bom
Conteúdo dinâmico Via proxy Suporte integrado
Complexidade de configuração Média Simples

1.3 Arquitetura Típica


Navegador → Nginx → Arquivos Estáticos | Proxy Reverso → Aplicação Backend (Node.js/PHP/Tomcat)
  1. Instalação e Inicialização

2.1 Instalação no Ubuntu/Debian


# Atualizar lista de pacotes
sudo apt update

# Instalar Nginx
sudo apt install nginx

# Iniciar serviço
sudo systemctl start nginx

# Iniciar com o sistema
sudo systemctl enable nginx

# Verificar status
sudo systemctl status nginx

2.2 Verificação da Instalação


# Verificar versão
nginx -v

# Testar arquivo de configuração
sudo nginx -t

# Recarregar configuração (sem interromper serviço)
sudo nginx -s reload

2.3 Teste de Acesso

Acesso via navegador: http://IP_DO_SERVIDOR

Resultado esperado: Exibição da página de boas-vindas "Welcome to nginx!"

  1. Detalhamento do Arquivo de Configuração

3.1 Localização dos Arquivos


/etc/nginx/nginx.conf          # Arquivo de configuração principal
/etc/nginx/sites-available/    # Diretório de configurações de site
/etc/nginx/sites-enabled/      # Links para sites habilitados
/var/www/html/                 # Diretório raiz padrão do site

3.2 Estrutura Central


# Configuração global
worker_processes 1;           # Número de processos de trabalho

# Configuração de eventos
events {
    worker_connections 1024;  # Máximo de conexões por processo
}

# Configuração do serviço HTTP
http {
    # Tipos MIME
    include       /etc/nginx/mime.types;
    
    # Bloco de servidor (host virtual)
    server {
        listen       80;      # Porta de escuta
        server_name  exemplo.com;  # Nome do domínio
        
        location / {          # Regra de correspondência de URL
            root   /var/www/html;
            index  index.html;
        }
    }
}

3.3 Explicação dos Conceitos Chave

  • Bloco server: Configuração de um site
  • Bloco location: Regras de correspondência de caminho de URL
  • listen: Porta de escuta (80=HTTP, 443=HTTPS)
  • root: Diretório de arquivos do site
  • index: Arquivo de página inicial padrão
  1. Implementação de Funcionalidades Essenciais

4.1 Implantação de Site Estático

Objetivo: Implantar um site HTML simples

Passos: 1. Criar arquivos do site ```

    sudo mkdir -p /var/www/meusite
    cat > /var/www/meusite/index.html << EOF
    
    <html>
    <head><title>Meu Site</title></head>
    <body><h1>Olá Nginx!</h1></body>
    </html>
    EOF
    
```
  1. Configurar host virtual ```

     sudo nano /etc/nginx/sites-available/meusite
    
    
    **Conteúdo do arquivo de configuração**:
    
    
     server {
         listen 80;
         server_name meusite.local;
    
         root /var/www/meusite;
         index index.html;
    
         location / {
             try_files $uri $uri/ =404;
         }
     }
    
  2. Habilitar site ```

     sudo ln -s /etc/nginx/sites-available/meusite /etc/nginx/sites-enabled/
     sudo nginx -t
     sudo systemctl reload nginx
    
  3. Teste local ```

     # Editar arquivo hosts
     echo "127.0.0.1 meusite.local" | sudo tee -a /etc/hosts
    
     # Acessar via navegador
     curl http://meusite.local
    
    
    

4.2 Prática de Proxy Reverso

Objetivo: Nginx fazendo proxy para uma aplicação Node.js

Pré-requisito: Instalar Node.js e executar aplicação


# Criar aplicação Node.js simples
mkdir ~/meuapp && cd ~/meuapp
cat > app.js << EOF
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Olá do Node.js!');
}).listen(3000);
EOF

# Executar em segundo plano
node app.js &

Configuração Nginx:


server {
    listen 80;
    server_name api.local;
    
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Teste:


echo "127.0.0.1 api.local" | sudo tee -a /etc/hosts
curl http://api.local
# Saída esperada: Olá do Node.js!
  1. Casos de Configuração Comuns

5.1 Configuração HTTPS (Let's Encrypt)


# Instalar certbot
sudo apt install certbot python3-certbot-nginx

# Obter certificado
sudo certbot --nginx -d exemplo.com

# Renovação automática
sudo crontab -e
# Adicionar: 0 12 * * * /usr/bin/certbot renew --quiet

Configuração Nginx:


server {
    listen 80;
    server_name exemplo.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name exemplo.com;
    
    ssl_certificate /etc/letsencrypt/live/exemplo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exemplo.com/privkey.pem;
    
    root /var/www/html;
    index index.html;
}

5.2 Balanceamento de Carga

Cenário: 2 servidores back end (192.168.1.10:3000, 192.168.1.11:3000)


upstream backend {
    server 192.168.1.10:3000 weight=1;
    server 192.168.1.11:3000 weight=1;
}

server {
    listen 80;
    location / {
        proxy_pass http://backend;
    }
}

5.3 Suporte a PHP


location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

5.4 Cache de Arquivos Estáticos


location ~* \.(jpg|jpeg|png|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}
  1. Solução de Problemas

6.1 Erros Comuns

Mensagem de Erro Causa Solução
502 Bad Gateway Serviço backend não iniciado Verificar status do serviço backend
403 Forbidden Problema de permissão chmod -R 755 /var/www/
404 Not Found Caminho de arquivo incorreto Verificar configuração root
413 Request Entity Too Large Limite de upload de arquivo client_max_body_size 10M;

6.2 Comandos de Diagnóstico


# Verificar configuração
sudo nginx -t

# Verificar log de erros
sudo tail -f /var/log/nginx/error.log

# Verificar log de acesso
sudo tail -f /var/log/nginx/access.log

# Reiniciar serviço
sudo systemctl restart nginx
  1. Otimização de Desempenho

7.1 Configuração de Otimização Básica


worker_processes auto;                    # Detectar automaticamente número de núcleos de CPU
worker_connections 2048;                  # Aumentar número de conexões

# Compressão
gzip on;
gzip_types text/plain application/json;

# Ocultar informação de versão
server_tokens off;

7.2 Timeout de Conexão


keepalive_timeout 65;
client_header_timeout 10s;
client_body_timeout 10s;
  1. Referência Rápida


# ========== Instalação e Inicialização ==========
sudo apt install nginx
sudo systemctl start nginx

# ========== Teste de Configuração ==========
sudo nginx -t
sudo nginx -s reload

# ========== Site Estático ==========
server {
    listen 80;
    root /var/www/html;
    index index.html;
}

# ========== Proxy Reverso ==========
location / {
    proxy_pass http://127.0.0.1:3000;
}

# ========== HTTPS ==========
sudo certbot --nginx

# ========== Visualização de Logs ==========
tail -f /var/log/nginx/error.log

Tags: nginx servidor-web proxy-reverso balanceamento-de-carga HTTPS

Publicado em 7-7 23:24