Otimização de performance do Nginx
Nginx com configurações padrão já é muito performático, mas para VPS com alto tráfego ou muitas conexões simultâneas, ajustes no número de workers, keepalive, cache de arquivos abertos e parâmetros do kernel Linux podem triplicar o throughput sem upgrade de hardware.
Configurações de workers e conexões
Ajuste o número de workers e o limite de conexões para o hardware disponível:
# /etc/nginx/nginx.conf
# worker_processes: número de processos worker
# auto = número de CPUs disponíveis (recomendado)
worker_processes auto;
# worker_cpu_affinity: associar workers a CPUs específicas
# Para 4 CPUs: 1000 0100 0010 0001
worker_cpu_affinity auto;
# Limite de descritores de arquivo por worker
# Deve ser >= worker_connections
worker_rlimit_nofile 65536;
events {
# Máximo de conexões simultâneas por worker
# Total = worker_processes × worker_connections
worker_connections 4096;
# Usar epoll (Linux) — event-driven, mais eficiente que select/poll
use epoll;
# Aceitar múltiplas conexões de uma vez (padrão: off)
multi_accept on;
}
http {
# Número máximo de requisições por conexão keepalive (cliente)
keepalive_requests 1000;
# Timeout de conexão keepalive com o cliente
keepalive_timeout 65s;
# Aumentar o limite de descritores de arquivo no sistema:
# sudo nano /etc/security/limits.conf
# nginx soft nofile 65536
# nginx hard nofile 65536
}Otimizar buffers e timeouts
Buffers mal configurados causam uso excessivo de memória ou quedas de performance:
# /etc/nginx/nginx.conf — bloco http {}
# Buffers de proxy (respostas do backend para o Nginx)
proxy_buffers 16 32k; # 16 buffers de 32k
proxy_buffer_size 32k; # buffer para o início da resposta (headers)
proxy_busy_buffers_size 64k;
# Timeouts
proxy_connect_timeout 5s; # tempo para conectar ao backend
proxy_send_timeout 60s; # tempo para enviar dados ao backend
proxy_read_timeout 60s; # tempo para receber dados do backend
send_timeout 30s; # timeout entre bytes enviados ao cliente
# Buffers de leitura do cliente (body da requisição)
client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;
# Desabilitar buffer de proxy para respostas em streaming (SSE, WebSocket)
# location /events/ { proxy_buffering off; }
# sendfile: transferir arquivos sem copiar para userspace (muito mais rápido)
sendfile on;
# tcp_nopush: enviar headers e início do arquivo em um pacote TCP
tcp_nopush on;
# tcp_nodelay: desabilitar algoritmo de Nagle para low-latency
tcp_nodelay on;Open file cache: evitar syscalls de I/O repetidas
Cache de descritores de arquivos abertos reduz syscalls ao servir estáticos:
# /etc/nginx/nginx.conf — bloco http {}
# open_file_cache: cachear informações de arquivos (inode, permissões)
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s; # revalidar a cada 30s
open_file_cache_min_uses 2; # cachear arquivos acessados ≥ 2 vezes
open_file_cache_errors on; # cachear também os erros (404)
# Benefício: em vez de stat(), open() e close() para cada requisição de arquivo,
# o Nginx reutiliza o descritor cacheado — reduz syscalls em 60-80% para estáticos
# Para VPS com muitos arquivos estáticos (imagens, CSS, JS):
# max=50000 para sites com muitos assets diferentesTuning do kernel Linux para alta concorrência
Parâmetros do kernel que afetam diretamente a performance do Nginx:
# /etc/sysctl.conf — parâmetros de kernel para VPS de produção
# Aplicar: sudo sysctl -p
# Aumentar limites de conexões simultâneas
net.core.somaxconn = 65536 # tamanho da fila de conexões pendentes
net.core.netdev_max_backlog = 65536 # tamanho da fila de pacotes de entrada
# TCP: reutilizar portas rapidamente após fechamento
net.ipv4.tcp_tw_reuse = 1
# Aumentar range de portas efêmeras
net.ipv4.ip_local_port_range = 1024 65535
# Buffer TCP
net.core.rmem_max = 134217728 # 128 MB read buffer
net.core.wmem_max = 134217728 # 128 MB write buffer
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# File descriptors
fs.file-max = 2097152
# Aplicar:
sudo sysctl -p
# Verificar limite atual de file descriptors:
ulimit -n
# Aumentar para o processo Nginx:
sudo systemctl edit nginx
# [Service]
# LimitNOFILE=65536Benchmark e verificação de performance
Medir a performance antes e depois das otimizações:
# Apache Bench — teste simples de throughput:
ab -n 10000 -c 100 https://seudominio.com.br/
# wrk — benchmark mais avançado com múltiplas threads:
sudo apt install -y wrk
wrk -t4 -c100 -d30s https://seudominio.com.br/
# wrk com script Lua (simular POST com JSON):
cat > post.lua << 'EOF'
wrk.method = "POST"
wrk.body = '{"teste": "dados"}'
wrk.headers["Content-Type"] = "application/json"
EOF
wrk -t4 -c100 -d30s -s post.lua https://api.seudominio.com.br/api/test
# Métricas a observar:
# Requests/sec: throughput total
# Latency avg/p99: latência média e percentil 99
# Non-2xx responses: erros durante o teste
# Monitorar recursos durante o benchmark:
# CPU: htop (ver uso por core)
# Conexões: ss -s
# Nginx stats: curl http://127.0.0.1:8080/nginx-status$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.