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?
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.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.- Redução de I/O: Se possível, monte a pasta
/var/cache/nginx/fastcgi_tempem 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
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.
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.
É 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
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

