Como configurar o cache do servidor (Cloudflare + Nginx) para entregar páginas estáticas em menos de 100ms
Guia de DevOps para configurar regras de edge caching e cabeçalhos Cache-Control para otimizar a velocidade global do seu site.
A latência de rede e o tempo de resposta do servidor inicial (conhecido como TTFB - Time to First Byte) são métricas essenciais para o SEO e para a experiência do usuário. Quando o navegador de um visitante precisa aguardar centenas de milissegundos para receber a primeira linha de HTML do servidor de origem, toda a cadeia de renderização subsequente é atrasada.
Para alcançar um TTFB inferior a 100ms em escala global, a melhor estratégia de infraestrutura é implementar uma arquitetura de cache combinando o poder do servidor web Nginx no back-end com a rede de distribuição de conteúdo (CDN) da Cloudflare na borda (Edge).
Neste guia técnico de DevOps, você aprenderá a configurar cabeçalhos de controle de cache e regras na Cloudflare para servir páginas estáticas de forma instantânea.
O que é Edge Caching e TTFB?
O Edge Caching (Cache de Borda) é o processo de armazenar arquivos e respostas do site em servidores geograficamente distribuídos mais próximos do usuário final (pontos de presença ou PoPs). O TTFB (Time to First Byte) mede a duração desde a requisição inicial HTTP até o recebimento do primeiro byte de dados de resposta do servidor de destino.
Ao adotar uma arquitetura de cache bem-configurada, a maioria das requisições feitas ao seu site nem sequer chega ao seu servidor de origem (Nginx). A Cloudflare atende a requisição diretamente da borda da rede física, eliminando a latência de processamento de banco de dados e roteamento.
sequenceDiagram
participant U as Usuário Final
participant CF as Cloudflare (Borda)
participant NG as Nginx (Origem)
U->>CF: Requisição HTTP (GET /pagina)
alt Cache HIT (Página em cache na Cloudflare)
CF-->>U: Retorna página estática (<100ms)
else Cache MISS (Página expirada ou não cacheada)
CF->>NG: Encaminha Requisição HTTP
NG->>NG: Processa a Página e gera Cabeçalhos
NG-->>CF: Retorna página + Cache-Control Headers
CF->>CF: Armazena cópia na Borda
CF-->>U: Retorna resposta ao Usuário
end
Configuração do Servidor Web Nginx
O Nginx é a base da nossa origem. Precisamos configurá-lo para enviar os cabeçalhos HTTP corretos de cache para que a Cloudflare (e os navegadores dos usuários) saibam exatamente o que armazenar em cache e por quanto tempo.
1. Definindo Cabeçalhos Cache-Control
No seu arquivo de configuração do bloco de servidor do Nginx (normalmente localizado em /etc/nginx/sites-available/default ou /etc/nginx/conf.d/site.conf), configure as regras de cache para ativos estáticos e páginas HTML.
# Configuração para arquivos de mídia e assets (CSS, JS, Imagens)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|webp|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, no-transform";
add_header Access-Control-Allow-Origin "*";
access_log off;
log_not_found off;
}
# Configuração para páginas HTML dinâmicas que podem ser cacheadas
location / {
# Define que a resposta pode ser mantida em cache pelos proxies por 1 hora (3600s)
# e pelo navegador do cliente por 10 minutos (600s)
add_header Cache-Control "public, max-age=600, s-maxage=3600";
# Adiciona um cabeçalho customizado para depurar o status do cache do Nginx
add_header X-Cache-Status $upstream_cache_status;
try_files $uri $uri/ /index.php?$query_string;
}
2. Ativando Compressão Brotli / Gzip
A compressão reduz o tamanho dos arquivos transferidos, o que otimiza a latência. Certifique-se de que a compressão moderna está ativada no Nginx:
# Configurações de Gzip
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;
gzip_comp_level 6;
Configuração da Cloudflare para Cache Total
Por padrão, a Cloudflare apenas faz cache de arquivos estáticos como imagens, CSS e JS. Ela não armazena em cache o HTML de páginas dinâmicas. Para alterar isso e conseguir o carregamento sub-100ms nas páginas do seu site, precisamos forçar o cacheamento do HTML.
1. Criando Regras de Cache (Cache Rules)
No painel da Cloudflare:
- Navegue até a aba Caching > Cache Rules (ou Regras de Cache).
- Clique em Create Rule.
- Defina um nome para a regra (ex: “Cache HTML Completo”).
- No campo Field, defina
Hostnamee insira o domínio do seu site (ex:meusite.com.br). - Em Cache Eligibility, selecione Eligible for cache.
- Em Edge TTL, selecione Respect origin headers (para respeitar o
s-maxageconfigurado no Nginx) ou defina um tempo estático (ex: 2 horas). - Em Browser TTL, defina para respeitar os cabeçalhos de origem.
2. Tratando Consultas de Query Strings
Por padrão, a Cloudflare trata requisições com Query Strings diferentes (ex: /?utm_source=google) como arquivos separados. Isso pode gerar múltiplas requisições de origem desnecessárias. Na configuração do comportamento de cache, ative a opção Ignore Query String se as páginas do seu site não alterarem o conteúdo dinamicamente com base nas campanhas de marketing.
Comparativo de Escopos de Cache
| Nível de Cache | Local de Armazenamento | Latência Típica | Facilidade de Invalidação |
|---|---|---|---|
| Cache do Navegador | Memória local do dispositivo do usuário. | <5ms (Instantâneo) | Difícil (requer mudança de nome de arquivo ou reload forçado). |
| Edge Cache (Cloudflare) | Servidores CDN localizados geograficamente perto do usuário. | 10ms - 50ms | Fácil (via API da Cloudflare ou Painel Web). |
| Server Cache (Nginx) | Memória RAM ou SSD do servidor de origem. | 50ms - 150ms | Média (limpeza de diretório /var/cache/nginx). |
Como Invalidar o Cache Programaticamente
Ao utilizar caches agressivos, o maior desafio técnico é atualizar o conteúdo quando há modificações. Podemos configurar um webhook de CI/CD para expurgar o cache da Cloudflare sempre que um novo deploy é realizado.
Abaixo está um exemplo de comando curl que limpa todo o cache da Cloudflare usando a API oficial:
curl -X POST "https://api.cloudflare.com/client/v4/zones/SUA_ZONE_ID_AQUI/purge_cache" \
-H "X-Auth-Email: [email protected]" \
-H "Authorization: Bearer SEU_API_TOKEN_CLOUDFLARE" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
Conclusão
Entregar páginas em menos de 100ms exige que a maior parte da computação seja resolvida antes de bater na sua origem. Configurar o Nginx para fornecer diretivas de Cache-Control precisas e instruir a Cloudflare a guardar cópias das suas páginas HTML é uma das formas de otimização de infraestrutura mais custo-eficientes que existem. Além de aliviar a carga da sua CPU no servidor de origem, você blinda seu site contra picos repentinos de tráfego, garantindo conversão alta e constante.