Lista de Verificação Essencial para Ajuste de Desempenho do Nginx em Sites de Alto Tráfego

Desbloqueie o desempenho máximo do seu site de alto tráfego com esta lista de verificação essencial de ajuste do Nginx. Este guia abrangente cobre configurações críticas, como otimização de processos de worker, gerenciamento de conexões, ajuste fino de buffers e implementação de cache robusto. Aprenda a utilizar a compressão Gzip, otimizar o registro de logs, ajustar os tempos limite e proteger SSL/TLS para tempos de carregamento mais rápidos e carga reduzida do servidor. Eleve sua configuração Nginx para uma velocidade e confiabilidade superiores em servidores de alto tráfego.

61 visualizações

Checklist Essencial de Otimização de Desempenho do Nginx para Websites de Alto Tráfego

Para qualquer website que experimente um tráfego significativo, o Nginx destaca-se como um servidor web e proxy reverso potente e altamente eficiente. No entanto, simplesmente implementar o Nginx não é suficiente para garantir um desempenho ideal sob carga pesada. A configuração e otimização adequadas são cruciais para liberar todo o seu potencial, garantindo que suas aplicações web permaneçam rápidas, responsivas e confiáveis.

Este artigo fornece uma checklist abrangente de configurações e diretivas chave do Nginx projetadas especificamente para otimizar o desempenho em ambientes de alto tráfego. Cobriremos tudo, desde o gerenciamento de processos de worker e conexões até o ajuste fino de buffers, implementação de estratégias robustas de cache e otimização da compressão. Ao abordar sistematicamente estas áreas, você pode reduzir significativamente a carga do servidor, aumentar a velocidade de entrega de conteúdo e melhorar a experiência geral do usuário.

1. Otimizar Processos de Worker e Conexões

O Nginx utiliza um modelo de processo mestre-worker. O processo mestre lê a configuração e gerencia os processos de worker, que lidam com as solicitações reais dos clientes. Configurá-los corretamente pode melhorar drasticamente a concorrência e a utilização de recursos.

worker_processes

Esta diretiva determina quantos processos de worker o Nginx irá criar. Geralmente, defini-la como auto permite que o Nginx detecte o número de núcleos de CPU e crie um número igual de processos de worker, o que é uma prática recomendada comum.

worker_connections

Define o número máximo de conexões simultâneas que um único processo de worker pode abrir. Essa configuração, em conjunto com worker_processes, dita o total teórico de conexões concorrentes que o Nginx pode suportar (worker_processes * worker_connections).

multi_accept

Permite que um processo de worker aceite múltiplas novas conexões de uma só vez, prevenindo potenciais gargalos sob alta carga.

# /etc/nginx/nginx.conf

worker_processes auto; # Geralmente definido como 'auto' ou o número de núcleos de CPU

events {
    worker_connections 1024; # Ajuste com base na capacidade do servidor e carga esperada
    multi_accept on;
}

Dica: Monitore o uso da CPU do seu servidor. Se worker_processes estiver definido como auto e a utilização da sua CPU estiver consistentemente alta, você pode considerar aumentar worker_connections ou escalar os recursos do seu servidor.

2. Gerenciamento Eficiente de Conexões

Otimizar a forma como o Nginx lida com conexões de rede pode reduzir a sobrecarga e melhorar a capacidade de resposta.

keepalive_timeout

Especifica por quanto tempo uma conexão de cliente keep-alive permanecerá aberta. Reutilizar conexões reduz a sobrecarga de estabelecer novas conexões TCP e handshakes SSL. Um valor comum é de 15 a 65 segundos, dependendo da interatividade da sua aplicação.

sendfile

Habilita a transferência direta de dados entre descritores de arquivo, ignorando o buffer do espaço do usuário. Isso melhora significativamente o desempenho ao servir arquivos estáticos.

tcp_nopush

Funciona com sendfile. O Nginx tenta enviar o cabeçalho HTTP e o início do arquivo em um único pacote. Depois disso, ele envia dados em pacotes completos. Isso reduz o número de pacotes enviados.

tcp_nodelay

Instrui o Nginx a enviar dados assim que estiverem disponíveis, sem buffering. Isso é benéfico para aplicações interativas onde baixa latência é mais crítica do que maximizar o throughput (por exemplo, aplicações de chat ou atualizações em tempo real).

http {
    keepalive_timeout 65; # Conexões keep-alive por 65 segundos
    sendfile on;
    tcp_nopush on; # Requer sendfile on
    tcp_nodelay on; # Útil para proxy de conteúdo dinâmico
}

3. Otimização de Buffer

O Nginx usa buffers para lidar com solicitações de clientes e respostas de servidores upstream (como servidores de aplicação). Dimensionar esses buffers corretamente pode prevenir I/O de disco desnecessário, reduzir o uso de memória e melhorar o throughput.

Buffers do Cliente

  • client_body_buffer_size: Tamanho do buffer para corpos de solicitação do cliente. Se um corpo exceder isso, ele é escrito em um arquivo temporário.
  • client_header_buffer_size: Tamanho do buffer para a primeira linha e cabeçalhos de uma solicitação de cliente.
  • large_client_header_buffers: Define o número e o tamanho de buffers maiores para leitura de cabeçalhos de solicitação do cliente. Útil para solicitações com muitos cookies ou cabeçalhos referer longos.

Buffers de Proxy (para configurações de proxy reverso)

  • proxy_buffers: O número e o tamanho dos buffers usados para ler respostas do servidor proxied.
  • proxy_buffer_size: O tamanho do primeiro buffer para ler a resposta. Tipicamente menor, pois muitas vezes contém apenas cabeçalhos.
  • proxy_busy_buffers_size: A quantidade máxima de buffers de resposta que podem estar no estado 'ocupado' (sendo ativamente enviados ao cliente) a qualquer momento.

Buffers FastCGI (para PHP-FPM, etc.)

  • fastcgi_buffers: O número e o tamanho dos buffers usados para ler respostas do servidor FastCGI.
  • fastcgi_buffer_size: O tamanho do primeiro buffer para ler a resposta.
http {
    # Buffers do Cliente
    client_body_buffer_size 1M; # Ajuste com base no tamanho esperado do corpo da solicitação (por exemplo, uploads de arquivo)
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k; # 4 buffers, cada um com 8KB de tamanho

    # Buffers de Proxy (se o Nginx atuar como um proxy reverso)
    proxy_buffers 8 16k; # 8 buffers, cada um com 16KB
    proxy_buffer_size 16k; # Primeiro buffer 16KB
    proxy_busy_buffers_size 16k; # Máximo 16KB de buffers ocupados

    # Buffers FastCGI (se o Nginx funcionar com PHP-FPM)
    fastcgi_buffers 116 8k; # 116 buffers, cada um com 8KB (por exemplo, para WordPress)
    fastcgi_buffer_size 16k; # Primeiro buffer 16KB
}

Aviso: Configurar buffers muito pequenos pode levar a I/O de disco e degradação de desempenho. Configurá-los muito grandes pode consumir memória excessiva. Encontre um equilíbrio através de testes.

4. Implementar Estratégias Robustas de Cache

O cache é uma das maneiras mais eficazes de melhorar o desempenho e reduzir a carga em seus servidores backend. O Nginx pode servir como um poderoso cache de conteúdo.

proxy_cache_path

Define o caminho para o diretório de cache, seu tamanho, o número de níveis de subdiretório e por quanto tempo os itens inativos permanecem no cache.

proxy_cache

Ativa o cache para um determinado bloco location, referenciando a zona definida em proxy_cache_path.

proxy_cache_valid

Define o tempo durante o qual o Nginx deve armazenar em cache respostas com códigos de status HTTP específicos.

proxy_cache_revalidate

Quando habilitado, o Nginx usará os cabeçalhos If-Modified-Since e If-None-Match para revalidar o conteúdo em cache com o backend, reduzindo o uso de largura de banda.

proxy_cache_use_stale

Instrui o Nginx a servir conteúdo em cache obsoleto se o servidor backend estiver inoperante, sem resposta ou passando por erros. Isso melhora muito a disponibilidade.

expires

Define os cabeçalhos Cache-Control e Expires para o cache de lado do cliente de arquivos estáticos. Isso minimiza solicitações repetidas ao Nginx.

http {
    # Define uma zona de cache de proxy no bloco http
    proxy_cache_path /var/cache/nginx/my_cache levels=1:2 keys_zone=my_cache:10m inactive=60m max_size=10g;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://my_upstream_backend;
            proxy_cache my_cache; # Habilita o cache para esta location
            proxy_cache_valid 200 302 10m; # Cache de respostas bem-sucedidas por 10 minutos
            proxy_cache_valid 404 1m; # Cache de 404s por 1 minuto
            proxy_cache_revalidate on;
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
            add_header X-Cache-Status $upstream_cache_status; # Ajuda na depuração
        }

        # Cache de arquivos estáticos no navegador por um período mais longo
        location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff|woff2|ttf|svg|eot)$ {
            expires 30d; # Cache por 30 dias
            add_header Cache-Control "public, no-transform";
            # Para arquivos estáticos, considere servir diretamente do Nginx se não for proxied
            root /var/www/html;
        }
    }
}

5. Habilitar Compressão Gzip

Comprimir respostas antes de enviá-las aos clientes pode reduzir significativamente o uso de largura de banda e melhorar os tempos de carregamento da página, especialmente para conteúdo baseado em texto.

gzip on

Ativa a compressão gzip.

gzip_comp_level

Define o nível de compressão (1-9). O Nível 1 é o mais rápido com menos compressão; o Nível 9 é o mais lento com compressão máxima. O Nível 6 geralmente oferece um bom equilíbrio.

gzip_types

Especifica os tipos MIME que devem ser compactados. Inclua tipos comuns de texto, CSS, JavaScript e JSON.

gzip_min_length

Define o tamanho mínimo de uma resposta (em bytes) para a qual a compressão deve ser habilitada. Arquivos pequenos não se beneficiam muito e podem até ser mais lentos devido à sobrecarga de compressão.

gzip_proxied

Instrui o Nginx a comprimir respostas mesmo que sejam proxied. any é um valor comum.

gzip_vary

Adiciona o cabeçalho Vary: Accept-Encoding às respostas, informando aos proxies que a resposta pode diferir com base no cabeçalho de solicitação Accept-Encoding.

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6; # Nível de compressão 1-9 (6 é um bom equilíbrio)
    gzip_buffers 16 8k; # 16 buffers, cada um com 8KB
    gzip_http_version 1.1; # Versão mínima de HTTP para compressão
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
    gzip_min_length 1000; # Comprimir apenas respostas maiores que 1KB
}

6. Otimizar o Logging

Embora os logs sejam essenciais para monitoramento e solução de problemas, o logging excessivo ou não otimizado pode introduzir I/O de disco significativo, especialmente em sites de alto tráfego.

access_log

  • Desabilitar para ativos estáticos: Para conteúdo estático altamente acessado (imagens, CSS, JS), desabilitar access_log pode economizar muito I/O.
  • Buffering: O Nginx pode armazenar entradas de log em buffer na memória antes de escrevê-las no disco, reduzindo a frequência de gravações em disco. Os parâmetros buffer e flush são usados aqui.

error_log

Defina o nível de logging apropriado (crit, error, warn, info, debug). Para produção, warn ou error geralmente são suficientes para capturar problemas críticos sem inundar os logs.

http {
    server {
        # Log de acesso padrão para conteúdo dinâmico
        access_log /var/log/nginx/access.log main;

        location ~* \.(jpg|jpeg|gif|png|css|js|ico|woff|woff2|ttf|svg|eot)$ {
            access_log off; # Desabilita o logging para arquivos estáticos comuns
            expires 30d;
        }
    }

    # Exemplo de log de acesso com buffer para o contexto HTTP principal
    # access_log /var/log/nginx/access.log main buffer=16k flush=5s;
    error_log /var/log/nginx/error.log warn; # Log apenas de avisos e superiores
}

7. Ajustar Timeouts

Timeouts configurados apropriadamente impedem que o Nginx mantenha conexões inativas por muito tempo, liberando recursos.

Timeouts do Lado do Cliente

  • client_body_timeout: Quanto tempo o Nginx espera que um cliente envie o corpo da solicitação.
  • client_header_timeout: Quanto tempo o Nginx espera que um cliente envie o cabeçalho da solicitação.
  • send_timeout: Quanto tempo o Nginx espera que um cliente aceite a resposta após ser enviada.

Timeouts de Proxy/FastCGI (se aplicável)

  • proxy_connect_timeout: Timeout para estabelecer uma conexão com um servidor proxied.
  • proxy_send_timeout: Timeout para transmitir uma solicitação ao servidor proxied.
  • proxy_read_timeout: Timeout para ler uma resposta do servidor proxied.
http {
    client_body_timeout 15s; # O cliente tem 15 segundos para enviar o corpo
    client_header_timeout 15s; # O cliente tem 15 segundos para enviar cabeçalhos
    send_timeout 15s; # O Nginx tem 15 segundos para enviar a resposta ao cliente

    # Para cenários de proxy
    proxy_connect_timeout 5s; # 5 segundos para conectar ao upstream
    proxy_send_timeout 15s; # 15 segundos para enviar a solicitação ao upstream
    proxy_read_timeout 15s; # 15 segundos para ler a resposta do upstream

    # Para cenários FastCGI
    fastcgi_connect_timeout 5s;
    fastcgi_send_timeout 15s;
    fastcgi_read_timeout 15s;
}

8. Otimização de SSL/TLS

Para sites habilitados para HTTPS, otimizar as configurações de SSL/TLS é crucial para reduzir a sobrecarga da CPU e melhorar o desempenho do handshake.

ssl_session_cache e ssl_session_timeout

Habilite o cache de sessão SSL para evitar o handshake TLS completo e computacionalmente caro para conexões subsequentes do mesmo cliente.

ssl_protocols e ssl_ciphers

Use protocolos TLS modernos e fortes (como TLSv1.2 e TLSv1.3) e conjuntos de cifras seguros. Priorize as cifras do servidor com ssl_prefer_server_ciphers on.

ssl_stapling

Habilita o grampeamento OCSP (OCSP stapling), onde o Nginx busca periodicamente a resposta OCSP da CA e a "grampeia" ao handshake SSL/TLS. Isso reduz a latência do lado do cliente, evitando uma consulta OCSP separada.

server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/your_domain.crt;
    ssl_certificate_key /etc/nginx/ssl/your_domain.key;

    ssl_session_cache shared:SSL:10m; # Cache compartilhado para 10MB de dados de sessão
    ssl_session_timeout 10m; # Sessões expiram após 10 minutos

    ssl_protocols TLSv1.2 TLSv1.3; # Use protocolos modernos e seguros
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s; # Especifique resolvedores DNS para consultas OCSP
    resolver_timeout 5s;
}

9. Cache de Arquivos Abertos (Open File Cache)

O Nginx pode armazenar descritores de arquivo em cache para arquivos frequentemente acessados, reduzindo a necessidade de chamadas repetidas ao sistema para abrir e fechar arquivos.

open_file_cache

Habilita o cache, especificando o número máximo de elementos e por quanto tempo os elementos inativos permanecem.

open_file_cache_valid

Define a frequência com que o cache deve verificar a validade de seus elementos.

open_file_cache_min_uses

Especifica o número mínimo de vezes que um arquivo deve ser acessado dentro do tempo inactive para permanecer no cache.

open_file_cache_errors

Determina se o Nginx deve armazenar em cache erros ao abrir arquivos.

http {
    open_file_cache max=100000 inactive=60s; # Cache de até 100.000 descritores de arquivo por 60s
    open_file_cache_valid 80s; # Verificar validade a cada 80 segundos
    open_file_cache_min_uses 1; # Cache de arquivos usados pelo menos uma vez
    open_file_cache_errors on; # Cache de erros relacionados à abertura de arquivos
}

Conclusão

A otimização de desempenho do Nginx é um processo contínuo, não uma configuração única. Esta checklist fornece um ponto de partida robusto para otimizar seus websites de alto tráfego. Lembre-se de que a configuração "perfeita" depende muito da sua aplicação específica, padrões de tráfego e recursos do servidor. Sempre teste as alterações em um ambiente de staging antes de implantar em produção e monitore continuamente suas instâncias Nginx e servidores backend usando ferramentas como monitoramento de atividade ao vivo do Nginx Plus, Prometheus, Grafana, ou ferramentas básicas de sistema (por exemplo, top, iostat, netstat).

Ao aplicar meticulosamente essas otimizações e adaptá-las ao seu ambiente, você pode garantir que o Nginx entregue conteúdo com velocidade, eficiência e confiabilidade excepcionais, mesmo sob as cargas mais exigentes.