kb.erickguedes.com
Nginx: Performance e Proxy Reverso

Instalação e Conteúdo Estático

Aula 1 de 6

Instalação do Nginx

Instalação via apt (Debian/Ubuntu)

# Atualizar repositórios
sudo apt update

# Instalar Nginx
sudo apt install nginx -y

# Verificar status
sudo systemctl status nginx
sudo systemctl enable nginx

# Verificar versão
nginx -v

Instalação via yum (RHEL/CentOS/Rocky)

# Adicionar EPEL (se necessário)
sudo yum install epel-release -y

# Instalar Nginx
sudo yum install nginx -y

# Iniciar e habilitar
sudo systemctl start nginx
sudo systemctl enable nginx

# Firewall
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Compilação a partir do fonte

# Dependências
sudo apt install build-essential libpcre3-dev zlib1g-dev openssl libssl-dev -y

# Download da fonte
cd /usr/src
sudo wget https://nginx.org/download/nginx-1.26.2.tar.gz
sudo tar -xzf nginx-1.26.2.tar.gz
cd nginx-1.26.2

# Configurar com módulos desejados
sudo ./configure \
    --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --modules-path=/usr/lib/nginx/modules \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --with-stream \
    --with-stream_ssl_module

# Compilar e instalar
sudo make && sudo make install

# Testar instalação
nginx -t

Estrutura do nginx.conf

# Diretórios principais do Nginx
/etc/nginx/
├── nginx.conf              # Configuração principal
├── sites-available/        # Configurações de sites
├── sites-enabled/          # Sites ativos (symlinks)
├── conf.d/                 # Configurações adicionais
├── modules-enabled/        # Módulos
├── snippets/               # Trechos reutilizáveis
├── ssl/                    # Certificados
└── proxy_params            # Parâmetros de proxy
# /etc/nginx/nginx.conf - Estrutura principal
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    multi_accept on;
    use epoll;
}

http {
    # Basic settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # MIME types
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Logging
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Gzip
    gzip on;

    # Virtual Hosts
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Blocos de Configuração

BlocoFunção
eventsConfigurações de conexão (worker_connections, epoll)
httpConfigurações do protocolo HTTP (global)
serverConfiguração de um site/virtual host
locationConfiguração para caminhos específicos
upstreamPool de servidores para load balancing
streamProxy TCP/UDP (não HTTP)

Servindo Conteúdo Estático

Primeiro Server Block

# /etc/nginx/sites-available/static-site
server {
    listen 80;
    listen [::]:80;

    server_name static.exemplo.com;

    root /var/www/static;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # Logs
    access_log /var/log/nginx/static-access.log;
    error_log /var/log/nginx/static-error.log;
}
# Habilitar site
sudo ln -s /etc/nginx/sites-available/static-site /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

root vs alias

# root: caminho completo é root + location
location /images {
    root /var/www/static;
    # Acessa: /var/www/static/images/foto.jpg
}

# alias: substitui o caminho do location
location /images {
    alias /var/www/static/photos;
    # Acessa: /var/www/static/photos/foto.jpg
}

# Exemplo prático
server {
    root /var/www/site;

    location / {
        try_files $uri $uri/ =404;
    }

    location /assets {
        alias /var/www/static-assets;
        # /assets/style.css -> /var/www/static-assets/style.css
    }

    location /downloads {
        root /var/www/files;
        # /downloads/arquivo.zip -> /var/www/files/downloads/arquivo.zip
    }
}

Diretiva index

server {
    root /var/www/site;

    # Ordem de procura dos arquivos index
    index index.html index.htm index.php index.nginx-debian.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /admin {
        index admin.html login.html;
    }
}

try_files

# CASO 1: Site estático com fallback
location / {
    try_files $uri $uri/ =404;
}

# CASO 2: SPA (Single Page Application)
location / {
    try_files $uri $uri/ /index.html;
}

# CASO 3: PHP com fallback
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# CASO 4: Múltiplas opções com named location
location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://localhost:3000;
}

Directory Listing

location /files {
    root /var/www;
    autoindex on;
    autoindex_exact_size off;      # Tamanho human-readable
    autoindex_localtime on;        # Data local

    # Proteger com autenticação
    auth_basic "Arquivos";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Lab: Servidor de Arquivos Estáticos

Configure um servidor Nginx servindo múltiplos diretórios com diferentes configurações.

# 1. Criar estrutura de diretórios
sudo mkdir -p /var/www/static-site/{public,assets/{css,js,images},files,admin}

# 2. Criar arquivos de exemplo
echo "<h1>Bem-vindo ao Nginx</h1>" | sudo tee /var/www/static-site/public/index.html
echo "body { background: #f0f0f0; }" | sudo tee /var/www/static-site/public/assets/css/style.css
echo "console.log('Nginx OK');" | sudo tee /var/www/static-site/public/assets/js/app.js
echo "<h1>Área Administrativa</h1>" | sudo tee /var/www/static-site/public/admin/index.html
echo "Arquivo para download" | sudo tee /var/www/static-site/public/files/readme.txt

# 3. Criar configuração do site
cat << 'NGINX' | sudo tee /etc/nginx/sites-available/static-lab
server {
    listen 80;
    server_name static-lab.local;

    root /var/www/static-site/public;
    index index.html;

    # Configuração principal
    location / {
        try_files $uri $uri/ =404;
    }

    # Assets com cache longo
    location /assets/ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

    # Alias para diretório de arquivos
    location /downloads/ {
        alias /var/www/static-site/public/files/;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }

    # Área administrativa protegida
    location /admin/ {
        auth_basic "Admin Access";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }

    # Negar acesso a arquivos ocultos
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    access_log /var/log/nginx/static-lab-access.log;
    error_log /var/log/nginx/static-lab-error.log;
}
NGINX

# 4. Criar senha para admin
sudo apt install apache2-utils -y  # para htpasswd
sudo htpasswd -c /etc/nginx/.htpasswd admin

# 5. Habilitar site
sudo ln -s /etc/nginx/sites-available/static-lab /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default

# 6. Testar e recarregar
sudo nginx -t && sudo systemctl reload nginx

# 7. Testar endpoints
curl -I http://static-lab.local/
curl -I http://static-lab.local/assets/css/style.css
curl http://static-lab.local/downloads/
curl -I http://static-lab.local/admin/

Conteúdo estático bem configurado é a base de Performance. Use root para mapeamento direto, alias para redirecionar caminhos, try_files para fallback inteligente e expires para cache eficiente.