Instalação
Instalar por Sistema Operacional
Ubuntu / Debiansudo apt install nginx
RHEL / CentOSsudo dnf install nginx
macOSbrew install nginx
Alpineapk add nginx
Dockerdocker run -p 80:80 nginx
Gerenciamento de Serviço
sudo systemctl start nginxIniciar o Nginx
sudo systemctl stop nginxParar o Nginx
sudo systemctl reload nginxRecarregar configuração (sem downtime)
sudo systemctl enable nginxHabilitar na inicialização
nginx -tTestar sintaxe da configuração
nginx -TTestar e exibir configuração completa
nginx -s reloadSinalizar processo em execução para recarregar
Configuração Básica
Localização dos Arquivos
/etc/nginx/nginx.confArquivo de configuração principal
/etc/nginx/conf.d/Configurações adicionais de sites (*.conf)
/etc/nginx/sites-available/Configurações de sites disponíveis (Debian)
/etc/nginx/sites-enabled/Links simbólicos para configurações ativas
/var/log/nginx/Logs de acesso e de erro
/var/www/html/Raiz de documentos padrão
Configuração Mínima
server { listen 80; server_name example.com; root /var/www/mysite; index index.html; }
Estrutura de Configuração
http { }Configurações do servidor HTTP (nível superior)
server { }Definição de host virtual
location { }Bloco de correspondência de URI
upstream { }Grupo de servidores back-end
events { }Configurações de tratamento de conexões
Blocos de Servidor
Hosts Virtuais Baseados em Nome
server { listen 80; server_name site-a.com; root /var/www/site-a; } server { listen 80; server_name site-b.com; root /var/www/site-b; }
Padrão e Curinga
server { listen 80 default_server; server_name _; return 444; # drop connection }
Redirecionamento HTTPS
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Blocos de Location
Prioridade de Correspondência (maior para menor)
= /pathCorrespondência exata (maior prioridade)
^~ /pathCorrespondência de prefixo, ignora regex
~ regexRegex sensível a maiúsculas
~* regexRegex insensível a maiúsculas
/pathCorrespondência de prefixo (menor prioridade)
Exemplos de Location
location = / { # exact root only } location /api/ { proxy_pass http://backend; } location ~* \.(jpg|png|gif)$ { expires 30d; }
try_files
location / { try_files $uri $uri/ /index.html; }

Tenta arquivo, depois diretório, depois fallback -- essencial para SPAs

Proxy Reverso
Proxy Básico
location /api/ { proxy_pass http://localhost:3000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Proxy para WebSocket
location /ws/ { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
Diretivas de Proxy
proxy_passURL do back-end
proxy_set_headerPassar cabeçalhos personalizados ao back-end
proxy_read_timeoutTimeout para resposta do back-end (padrão 60s)
proxy_buffering offDesabilitar buffer de resposta
proxy_redirectReescrever cabeçalhos Location do back-end
SSL / TLS
Servidor HTTPS
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/certs/example.crt; ssl_certificate_key /etc/ssl/private/example.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; }
Let's Encrypt com Certbot
sudo certbot --nginx -d example.com sudo certbot renew --dry-run
Boas Práticas de SSL
ssl_protocols TLSv1.2 TLSv1.3Desabilitar versões antigas do TLS
ssl_prefer_server_ciphers onServidor escolhe a cifra
ssl_session_cache shared:SSL:10mReutilização de sessão para desempenho
add_header Strict-Transport-SecurityCabeçalho HSTS
ssl_stapling onOCSP stapling para handshake mais rápido
Balanceamento de Carga
Bloco Upstream
upstream backend { server 10.0.0.1:3000; server 10.0.0.2:3000; server 10.0.0.3:3000; } server { location / { proxy_pass http://backend; } }
Métodos de Balanceamento de Carga
(padrão)Round-robin
least_connMenor número de conexões ativas
ip_hashSessões fixas por IP do cliente
hash $request_uriHash consistente por URI
Opções de Servidor
weight=3Enviar 3x mais tráfego
max_fails=3Falhas antes de marcar como inativo
fail_timeout=30sTempo para marcar servidor como inativo
backupUsar apenas quando os outros estiverem fora
downMarcar servidor como permanentemente offline
Arquivos Estáticos e Cache
Servir Arquivos Estáticos
location /static/ { alias /var/www/assets/; expires 30d; add_header Cache-Control "public, immutable"; }
Compressão Gzip
gzip on; gzip_types text/plain text/css application/json application/javascript; gzip_min_length 1000; gzip_comp_level 5;
Diretivas de Cache
expires 30dDefinir Expires e Cache-Control max-age
expires offDesabilitar cabeçalho expires
etag onHabilitar cabeçalho ETag (padrão)
sendfile onServir arquivos eficientemente via kernel
tcp_nopush onOtimizar envio de pacotes
Logs
Configuração de Log
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; # Custom log format log_format main '$remote_addr - $status ' '"$request" $body_bytes_sent'; access_log /var/log/nginx/access.log main;
Níveis do Log de Erros
debugDetalhado (requer --with-debug)
infoInformativo
noticeNormal mas relevante
warnAvisos
errorErros (padrão)
critProblemas críticos
Log Condicional
map $status $loggable { ~^[23] 0; default 1; } access_log /var/log/nginx/access.log combined if=$loggable;

Ignorar respostas 2xx/3xx nos logs para reduzir volume

Segurança
Limitação de Requisições
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; location /api/ { limit_req zone=api burst=20 nodelay; }
Controle de Acesso
location /admin/ { allow 192.168.1.0/24; deny all; }
Cabeçalhos de Segurança
X-Frame-Options DENYPrevenir clickjacking
X-Content-Type-Options nosniffPrevenir sniffing de MIME
X-XSS-Protection "1; mode=block"Filtro XSS (navegadores legados)
Content-Security-PolicyControlar fontes de carregamento de recursos
Referrer-Policy no-referrerControlar informações de referência
Padrões Comuns
SPA (Aplicação de Página Única)
location / { root /var/www/app; try_files $uri $uri/ /index.html; }
Cabeçalhos CORS
location /api/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; if ($request_method = OPTIONS) { return 204; } proxy_pass http://backend; }
Variáveis Úteis
$hostCabeçalho Host da requisição
$uriURI atual (normalizado)
$request_uriURI original com query string
$remote_addrEndereço IP do cliente
$schemehttp ou https
$argsParâmetros da query string
$statusCódigo de status da resposta