Pular para conteúdo

Purgação de Cache FastCGI para PHP-FPM

Cache ultra-rápido para WordPress com invalidação de cache automática e cirúrgica.


  • Nenhum Proxy Necessário


    O cache FastCGI se comunica diretamente com o PHP-FPM—sem sobrecarga de proxy reverso

  • Resposta em Microsegundos


    Páginas em cache servidas diretamente da memória ou SSD pelo NGINX

  • Purgação Seletiva


    Apenas páginas alteradas são purgadas, o restante do cache permanece ativo

  • Segurança Integrada


    Ignora o cache para usuários logados, administradores e carrinhos do WooCommerce


Quando Usar FastCGI vs Proxy Cache

Recurso Cache FastCGI Cache Proxy
Backend PHP-FPM (direto) Qualquer backend HTTP
Latência Menor (sem salto de proxy) Um pouco maior
Caso de uso WordPress, aplicativos PHP Node.js, Python, etc.
Complexidade de configuração Mais simples Mais flexível

Use o cache FastCGI se você estiver executando WordPress ou PHP diretamente no NGINX sem uma camada de proxy reverso.


Configuração Rápida

Passo 1: Instalar Módulos Necessários

# Instalar repositório GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Instalar módulo de purgação de cache
dnf -y install nginx-module-cache-purge

Habilite em /etc/nginx/nginx.conf:

load_module modules/ngx_http_cache_purge_module.so;

Passo 2: Configurar Cache FastCGI

Adicione ao seu bloco http em /etc/nginx/nginx.conf:

# Definição da zona de cache FastCGI
fastcgi_cache_path /var/cache/nginx/fastcgi
                   levels=1:2
                   keys_zone=WORDPRESS:100m
                   max_size=10g
                   inactive=60m
                   use_temp_path=off;

# Chave de cache (o que torna cada página em cache única)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Passo 3: Configurar Bloco de Servidor

Crie ou atualize seu bloco de servidor do WordPress:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;

    # Configurações de cache
    set $skip_cache 0;

    # Não cachear requisições POST
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # Não cachear URLs com strings de consulta
    if ($query_string != "") {
        set $skip_cache 1;
    }

    # Não cachear admin do WordPress, login ou caminhos específicos
    if ($request_uri ~* "/wp-admin/|/wp-login.php|/xmlrpc.php|/wp-cron.php") {
        set $skip_cache 1;
    }

    # Não cachear para usuários logados ou comentaristas recentes
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $skip_cache 1;
    }

    # Não cachear páginas do WooCommerce
    if ($request_uri ~* "/cart/|/checkout/|/my-account/") {
        set $skip_cache 1;
    }
    if ($http_cookie ~* "woocommerce_cart_hash|woocommerce_items_in_cart") {
        set $skip_cache 1;
    }

    # Cabeçalho de status do cache
    add_header X-Cache-Status $upstream_cache_status;

    # Habilitar método PURGE
    fastcgi_cache_purge PURGE from 127.0.0.1;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Cache FastCGI
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_valid 404 1m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # Importante para conteúdo dinâmico
        fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
        fastcgi_cache_lock on;
    }

    # Arquivos estáticos - nenhuma configuração de cache necessária
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Crie o diretório de cache e recarregue:

mkdir -p /var/cache/nginx/fastcgi
chown nginx:nginx /var/cache/nginx/fastcgi
nginx -t && systemctl reload nginx

Passo 4: Instalar Plugin do WordPress

  1. Vá para Plugins → Adicionar Novo
  2. Pesquise por "Proxy Cache Purge"
  3. Instale e ative
wp plugin install varnish-http-purge --activate

Configure o plugin:

  1. Vá para Configurações → Proxy Cache Purge
  2. Defina IP Personalizado para 127.0.0.1
  3. Salve

Passo 5: Configurar Backend de Cache NGINX

A partir da versão Proxy Cache Purge 5.9.0, o plugin suporta nativamente o formato de purgação curinga do NGINX. Configure-o para usar o backend NGINX:

  1. Vá para Proxy Cache Purge → Configurações
  2. Em Cache Backend, selecione NGINX
  3. Clique em Salvar Configurações

Adicione ao seu wp-config.php:

define( 'VHP_PURGE_BACKEND', 'nginx' );
Legado: Versão do plugin < 5.9.0

Se você estiver executando o Proxy Cache Purge anterior a 5.9.0, crie wp-content/mu-plugins/nginx-cache-purge-fix.php:

<?php
/**
 * Nome do Plugin: Correção de Purgação de Cache FastCGI NGINX
 * Descrição: Adiciona curinga para purgar todas as variantes de cache
 */
add_filter("vhp_purgeme_path", function($purgeme, $schema, $host, $path, $pregex, $p) {
    if (empty($pregex)) {
        $purgeme .= "*";
    }
    return $purgeme;
}, 10, 6);

Testando

# Primeiro pedido - deve ser MISS
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

# Segundo pedido - deve ser HIT
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: HIT

# Purgar o cache
curl -sX PURGE 'http://127.0.0.1/*' -H 'Host: example.com'

# Verificar purgado
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

Como Funciona

flowchart LR
    A["👤 Visitante"] -->|"GET /post/"| B["NGINX"]

    B -->|"Cache HIT"| C["⚡ Resposta Instantânea"]
    B -->|"Cache MISS"| D["PHP-FPM"]
    D --> E["WordPress"]
    E --> D
    D -->|"Armazenar em cache"| B
    B --> C

    style A fill:#667eea
    style B fill:#009639,color:#fff
    style C fill:#48bb78,color:#fff
    style D fill:#4a90d9,color:#fff
    style E fill:#4a90d9,color:#fff

Comparação de Desempenho

Métrica Sem Cache Cache FastCGI
Tempo de Resposta 200-500ms 5-20ms
Requisições/segundo 50-100 5.000+
Uso de CPU Alto Mínimo
Memória Alta (PHP) Baixa (NGINX)

Impacto no mundo real

O cache FastCGI geralmente melhora os tempos de resposta do WordPress em 10-50x e pode lidar com picos de tráfego sem dificuldades.


Configuração Avançada

Cache Diferentes Durações por Tipo de Conteúdo

# Cachear páginas por 60 minutos
fastcgi_cache_valid 200 60m;

# Cachear redirecionamentos por 10 minutos
fastcgi_cache_valid 301 302 10m;

# Não cachear erros por muito tempo
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 503 504 0;

Servir Conteúdo Obsoleto Durante Erros

fastcgi_cache_use_stale error timeout invalid_header
                        updating http_500 http_502 http_503 http_504;

Bloqueio de Cache para Prevenir Stampedes

fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;

Quando múltiplas requisições atingem uma página não cacheada simultaneamente, apenas uma requisição vai para o PHP-FPM. As outras aguardam o cache ser populado.


Resolução de Problemas

Páginas não estão sendo cacheadas

Verifique a variável $skip_cache. Problemas comuns:

  • Strings de consulta em todas as URLs (alguns plugins adicionam ?ver= às páginas)
  • Cookies sendo definidos em todas as páginas
  • Verifique: curl -sI sua-url | grep Set-Cookie
Páginas logadas estão sendo cacheadas

Verifique se a verificação de cookies inclui seus cookies de autenticação:

if ($http_cookie ~* "wordpress_logged_in") {
    set $skip_cache 1;
}
Cache não está purgando
  • Verifique a configuração do plugin: IP Personalizado = 127.0.0.1
  • Certifique-se de que o Cache Backend está definido como NGINX (ou VHP_PURGE_BACKEND está definido em wp-config.php)
  • Teste manualmente: curl -X PURGE 'http://127.0.0.1/page/*'

Relacionados