Guia Nginx FastCGI Cache: Configuração Avançada para Alta Performance

Nginx FastCGI Cache. Configurar o Nginx FastCGI Cache é uma das estratégias mais eficientes para escalar aplicações (como WordPress, Laravel ou PHP puro) sem gastar um centavo a mais com CPU ou memória RAM. O objetivo é transformar seu servidor de aplicação em um servidor de arquivos estáticos ultra-rápido para a maioria das requisições.

Para aguentar picos de tráfego, o segredo não é apenas “ligar o cache”, mas configurar travas (locks) e uso de conteúdo obsoleto (stale cache).

Aqui está o guia passo a passo focado em alta performance e resiliência.

1. A Estratégia: Microcaching vs. Full Page Caching

  • Microcaching: Cachear conteúdo por tempos curtos (ex: 1 a 5 segundos). Ideal para conteúdo muito dinâmico. Em um pico de 1000 req/s, apenas 1 requisição bate no PHP; as outras 999 são servidas instantaneamente pelo Nginx.
  • Full Page Caching: Cachear por tempos longos (ex: 1 hora). Ideal para blogs e sites de conteúdo.

A configuração abaixo funciona para ambos, focando na proteção contra picos.

2. Configuração do nginx.conf (Contexto HTTP)

Adicione estas linhas no bloco http { ... } do seu arquivo principal (/etc/nginx/nginx.conf).

Nginx

# Define o local do cache e a zona de memória
# /var/cache/nginx/fastcgi_temp: pasta onde os arquivos ficarão (crie-a se não existir)
# levels=1:2: estrutura de subpastas para não sobrecarregar o sistema de arquivos
# keys_zone=meu_cache:100m: nome da zona e 100MB de RAM para armazenar as CHAVES (não os arquivos)
# inactive=60m: se o arquivo não for acessado em 60m, ele é deletado
# max_size=1g: tamanho máximo total do cache em disco
fastcgi_cache_path /var/cache/nginx/fastcgi_temp levels=1:2 keys_zone=meu_cache:100m inactive=60m max_size=1g use_temp_path=off;

# Define a chave única do cache (separar http de https, e por host)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

3. Configuração do Servidor/Virtual Host

Dentro do bloco server { ... } ou location ~ \.php$ { ... } do seu site:

A. Regras de Exceção (Crucial)

Você não pode cachear usuários logados, páginas de admin ou carrinhos de compra.

Nginx

# Por padrão, vamos cachear
set $skip_cache 0;

# POST requests nunca devem ser cacheados
if ($request_method = POST) {
    set $skip_cache 1;
}

# Se houver query strings (ex: ?busca=xyz), decida se quer cachear. 
# Para segurança máxima, muitas vezes pulamos o cache, mas em picos pode ser útil cachear.
if ($query_string != "") {
    set $skip_cache 1;
}

# Não cachear URLs especiais (admin, login, wp-admin, etc)
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
    set $skip_cache 1;
}

# Não cachear se o usuário tiver cookies específicos (logado, comentado, etc)
# Exemplo para WordPress:
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $skip_cache 1;
}

B. Aplicação do Cache no PHP

Dentro do seu bloco location ~ \.php$:

Nginx

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    
    # ... configurações padrão do fastcgi_pass ...
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # Exemplo
    include fastcgi_params;
    
    # --- ATIVAÇÃO DO CACHE ---
    fastcgi_cache meu_cache;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    # Validade do cache: 200 (OK) e 301 (Redirect) por 60 minutos
    fastcgi_cache_valid 200 301 60m;
    
    # Cache de erros (404, 500) por tempo curto para evitar DDoS no backend
    fastcgi_cache_valid 404 500 502 503 1m;

    # --- O SEGREDO PARA PICOS DE TRÁFEGO ---
    
    # 1. Cache Lock: Impede "Cache Stampede". 
    # Se 1000 pessoas pedirem a mesma página não cacheada, o Nginx segura 999,
    # deixa passar 1 para o PHP, popula o cache e serve as outras 999.
    fastcgi_cache_lock on;
    fastcgi_cache_lock_timeout 5s;

    # 2. Use Stale: Se o PHP morrer (erro 500) ou estiver ocupado (timeout),
    # o Nginx serve a versão "velha" do cache em vez de mostrar erro.
    # "updating" permite servir cache velho enquanto um novo está sendo gerado em background.
    fastcgi_cache_use_stale error timeout invalid_header http_500 http_503 updating;
    
    # Permite atualização em background para não travar o usuário que deu azar de pegar o cache expirado
    fastcgi_cache_background_update on;

    # Header para Debug (verifique se está dando HIT ou MISS)
    add_header X-FastCGI-Cache $upstream_cache_status;
}

Por que isso aguenta picos sem hardware novo?

  1. fastcgi_cache_lock on;: Esta é a diretiva mais importante. Sem ela, quando o cache expira, todos os processos do PHP são bombardeados simultaneamente. Com ela, apenas um processo PHP é usado para regenerar a página.
  2. fastcgi_cache_use_stale updating;: Imagine que seu cache dura 10 segundos. No segundo 11, o Nginx percebe que venceu. Em vez de fazer o usuário esperar o PHP gerar a página, ele entrega a versão do segundo 10 (stale) instantaneamente e atualiza o cache em segundo plano (background). O usuário nunca sente lentidão.
  3. Redução de I/O: Se possível, monte a pasta /var/cache/nginx/fastcgi_temp em RAM (tmpfs). Como o Nginx é muito eficiente, mesmo 100MB de cache em RAM podem segurar milhares de conexões simultâneas pois o disco não será gargalo.

FAQ

O Nginx FastCGI Cache substitui o Varnish?

Em muitos casos, sim. O Nginx FastCGI Cache é nativo, simplifica a stack (menos um serviço para gerenciar) e oferece performance comparável ao Varnish para cache de página inteira, com a vantagem de suportar purga de cache e “stale while revalidate” nativamente.

O que é Cache Stampede e como o Nginx resolve?

Cache Stampede ocorre quando um cache expira e centenas de requisições atingem o backend simultaneamente. O Nginx resolve isso com a diretiva fastcgi_cache_lock, que permite que apenas uma requisição vá ao PHP para renovar o cache, enquanto as outras aguardam, evitando sobrecarga.

Como o FastCGI Cache lida com usuários logados ou carrinhos de compra?

É crucial configurar exceções (bypasses). Utilizando fastcgi_cache_bypass, configuramos o Nginx para ignorar o cache se detectar cookies específicos, como wordpress_logged_in ou itens no carrinho, garantindo que conteúdo dinâmico não seja cacheado estaticamente

O FastCGI Cache funciona com WordPress e WooCommerce?

Sim, funciona perfeitamente. É uma das formas mais eficientes de escalar WordPress. Basta configurar as regras de exceção para não cachear o painel administrativo (/wp-admin), o checkout e as sessões de usuário logado.

Veja Mais: Como configurar lemp com wordpress e let´s encrypt
Veja Mais: Cache de servidor vs cache de plugin: diferenças reais
Veja Mais: TCP Tuning para WordPress: Guia de Alta Performance
Veja Mais: Como adicionar cabeçalhos de segurança usando Cloudflare
Veja Mais: Como reduzir o tempo de resposta (TTFB) do servidor