Gerenciamento de Cache para Recursos Estáticos no Nginx

Conceiot de Cache

Cache é uma camada de armazenamento temporário de alta velocidade que armazena dados frequentemente acessados, reduzindo a necessidade de buscá-los repetidamente na fonte original. Em sistemas computacionais modernos, o cache é implementado tipicamente com tecnologias como SRAM, que oferece acesso mais rápido em comparação à memória principal baseada em DRAM.

Cache no Contexto Web

O cache web funciona como uma camada intermediária entre o servidor e o cliente, armazenando cópias de recursos como páginas HTML, imagens, scripts JavaScript e dados JSON. Quando uma requisição chega, o mecanismo de cache avalia se possui uma cópia válida do recurso solicitado. Em caso afirmativo, a resposta é entregue diretamente ao cliente sem necessidade de consultar o servidor de origem.

Classificação do Cache Web

  • Cache no lado do cliente: Cache do navegador
  • Cache no lado do servidor: Nginx, Redis, Memcached, Varnish, entre outros

Cache de Navegador

O cache do navegador armazena localmente recursos previamente carregados, permitindo que acessos subsequentes à mesma URL sejam atendidos sem novas requisições à rede. Isso resulta em carregamento mais rápido das páginas e menor consumo de recursos do servidor.

Benefícios do Cache de Navegador

  • Implementação de baixo custo
  • Redução do consumo de largura de banda
  • Diminuição da carga no servidor
  • Menor latência e carregamento mais rápido das páginas

Fluxo de Execução do Cache de Navegador

Os principais cabeçalhos HTTP relacionados ao cache são:

Cabeçalho Descrição
Expires Data e hora de expiração do cache
Cache-Control Diretivas de configuração do comportamento do cache
Last-Modified Data da última modificação do recurso
ETag Identificador único da versão do recurso (ex: hash MD5)

O fluxo completo funciona da seguinte forma:

  1. Na primeira requisição, o navegador não possui cache local, então envia a solicitação ao servidor.
  2. O servidor processa a requisição e retorna o status 200 junto com os cabeçalhos de cache apropriados.
  3. Nas requisições subsequentes, o navegador verifica se possui uma cópia em cache do recurso solicitado.
  4. Se não houver cache local, o processo volta ao passo 2.
  5. Se existir cache, o navegador verifica a validade baseando-se no cabeçalho Expires.
  6. Caso o cache não tenha expirado, o recurso é servido diretamente do armazenamento local.
  7. Se o cache expirou, o navegador verifica se o recurso foi modificado no servidor.
  8. Essa verificação é feita através dos cabeçalhos ETag e Last-Modified.
  9. Se o recurso não foi alterado, o servidor retorna o status 304 Not Modified e o navegador utiliza o cache local.
  10. Se houve modificação, o servidor retorna o recurso atualizado com status 200 e novas informações de cache.

Diretivas de Cache no Nginx

Diretiva expires

A diretiva expires controla o comportamento do cache, definindo os valores dos cabeçalhos HTTP Expires e Cache-Control nas respostas.

Sintaxe:

expires [modified] tempo;
expires epoch | max | off;

Valor padrão:

expires off;

Contexto: http, server, location

Opção Descrição
tempo Define o tempo de expiração em segundos. Valores negativos definem Cache-Control: no-cache. Valores positivos ou zero definem Cache-Control: max-age=segundos
epoch Define Expires para 1 de janeiro de 1970 e Cache-Control: no-cache
max Define Expires para 31 de dezembro de 2037 e Cache-Control: max-age=315360000 (10 anos)
off Não modifica os cabeçalhos de cache (comportamento padrão)

Exemplo de configuração:

server {
    listen 80;
    server_name exemplo.com;

    location /assets/ {
        root /var/www/site;
        expires 30d;
        add_header Cache-Control "public";
    }

    location /api/ {
        root /var/www/site;
        expires -1;
        add_header Cache-Control "no-store, no-cache, must-revalidate";
    }

    location /imagens/ {
        root /var/www/site;
        expires max;
    }
}

Diretiva add_header

A diretiva add_header permite adicionar cabeçalhos personalizados às respostas HTTP.

Sintaxe:

add_header nome valor [always];

Valor padrão: nenhum

Contexto: http, server, location

O parâmetro always garante que o cabeçalho seja adicionado independentemente do código de status da resposta.

Valores de Cache-Control

O cabeçalho Cache-Control aceita as seguintes diretivas:

Diretiva Descrição
must-revalidate Permite cache, mas exige validação com o servidor antes de reutilizra
no-cache O cliente deve revalidar o recurso antes de usar a versão em cache
no-store Proíbe armazenar qualquer parte da requisição ou resposta
no-transform Proíbe intermediários de alterar o tipo de mídia do recurso
public Permite que qualquer cache armazene a resposta
private Apenas o cache do navegador pode armazenar a resposta
proxy-revalidate Exige que caches intermediários revalidem a resposta
max-age=segundos Define o tempo máximo de vida útil do cache
s-maxage=segundos Define o tempo máximo de vida útil para caches compartilhados

Tags: nginx cache HTTP Cabeçalhos HTTP Cache de Navegador

Publicado em 6-25 00:18