Como configurar cabeçalhos de controle de cache no NGINX

Conteúdo

Cache é o procedimento de armazenamento de dados baixados para uso posterior, onde eles podem ser lidos do disco em vez de solicitá-los novamente. Fazer uso adequado do seu navegador e do cache de CDN pode acelerar significativamente o seu portal da web.

Como funciona o cache?

O navegador de cada usuário possui um cache integrado, que armazena objetos estáticos baixados de sites. Na próxima vez que eles se conectarem, se o objeto que eles estão solicitando ainda estiver no cache, será carregado da memória em vez de solicitá-lo novamente, o que irá acelerar significativamente o desempenho e reduzir a carga em seu servidor web no procedimento.

O navegador do usuário é um cache do lado do cliente. Apesar disto, muitos sites grandes também usarão uma rede de distribuição de conteúdo ou CDN. O CDN fica na frente de seu servidor da web e armazena em cache suas páginas no lado do servidor, geralmente em vários servidores de borda localizados ao redor do mundo. Isso melhora a latência de acesso, desempenho e reduz bastante o estresse em seu servidor web. Para obter mais informações sobre CDNs, você pode ler nosso guia aqui.

Cache-Control é um cabeçalho que você pode configurar seu servidor web para adicionar a todas as solicitações de saída. Ao usá-lo, você pode especificar quais recursos são armazenados em cache e por quanto tempo. Apesar disto, há algumas coisas a se prestar atenção antes de adicioná-lo a todo o site.

Algumas páginas deveriam Nunca ser armazenado em cache. Tudo o que requer o login de um usuário não deve ser armazenado em cache por um CDN, caso contrário, você correrá o risco mostrar as informações pessoais de um usuário para outras pessoas. Você ainda pode armazenar em cache esses tipos de páginas apenas no lado do navegador (configurando Cache-Control para private). Como uma regra geral, se a página será exatamente a mesma para todos os usuários, como sua página inicial, pode armazená-lo em cache. Recursos estáticos, como CSS e imagens, geralmente pode ser armazenado em cache, frequentemente por muito mais tempo.

Você também vai querer certificar-se de determinar valores de vida útil razoáveis. (TTL) para cada recurso. TTL controla quanto tempo o objeto permanecerá no cache antes de ser invalidado, o que leva o usuário a solicitar um novo objeto. A compensação aqui é entre um longo tempo de armazenamento em cache e atualizações rápidas.. Você não quer armazenar sua página inicial em cache por um ano inteiro, porque eu poderia mudar algo na terça. Determinar uma idade máxima de alguns minutos para sua página inicial é longo o suficiente para cobrir recarregamentos imediatos e rápido o suficiente para permitir uma rápida disseminação de atualizações.. Apesar disto, para recursos estáticos como imagens, é possível que eles nunca mudem, e deve ser preciso definir valores TTL altos, mesmo tão alto quanto dois anos.

Você sempre pode usar nomes de arquivos com versão para acionar uma recarga de cache. Se você publicar uma nova versão de uma folha de estilo CSS, você pode nomeá-lo styles-1.0.1.css, e o navegador do usuário (e qualquer CDN na frente dele) você o verá como um novo arquivo que precisa ser baixado novamente. Ao mesmo tempo, para alguns CDNs, você pode emitir substituições manuais para limpar o cache existente sem alterar nenhum nome de arquivo.

Como usar Cache-Control no NGINX

Cache-Control você tem algumas opções:

  • public – Qualquer um pode armazená-lo em cache, incluindo navegadores e CDN. Use isso para a maioria dos objetos estáticos.
  • private – Contém dados confidenciais que não podem ser armazenados em cache por meio de CDNs ou proxies reversos. O navegador do usuário pode armazená-lo em cache localmente. Use isto para a maioria das páginas autenticadas.
  • no-cache – Apesar do nome, não desabilite o cache. O navegador ainda pode armazenar em cache a solução para desempenho, mas você deve verificar com o servidor de origem por atualizações antes de usá-lo. Use isto se você quiser que o usuário revalide todas as vezes
  • no-store – Desative o cache completamente. Use isso apenas para dados altamente confidenciais que não devem ser enviados duas vezes.

Ao definir o max-age, sempre feito em segundos. Apesar disto, NGINX permite mais alguns valores personalizados:

  • -1, o off, que desabilitará o cache e não modificará os cabeçalhos existentes
  • epoch, definido para o tempo zero do Unix, que irá desabilitar explicitamente o cache e limpar todos os caches (útil si está usando NGINX como proxy inverso)
  • max, que irá expirar quando o universo terminar, a 31 de dezembro a 2037
  • 30s, por segundos
  • 1m, por minuto
  • 24h, por horas
  • 3d, por dias
  • 1M, por meses
  • 2y, durante anos

Ao mesmo tempo, você pode adicionar o no-transform diretriz, que desabilita qualquer conversão que possa ser realizada no recurso. Como um exemplo, alguns CDNs compactam imagens para reduzir a largura de banda. Esta diretiva desativa esse comportamento.

Para NGINX, você pode modificar os cabeçalhos Cache-Control com as seguintes diretivas:

expira 1e;
add_header Cache-Control "público, sem transformação";

A primeira linha define a idade máxima em 1 ano e o segundo estabelece o public e no-transform configurações de cache. Você pode adicionar isso a um server bloco para aplicar em todo o site, mas um método melhor é combinar as extensões de arquivo com um bloco de localização para determinar valores diferentes com base na extensão do arquivo:

localização ~ * .(?:css|js)$ {
  expira 1e;
  add_header Cache-Control "público";
}

Este bloco de localização usa uma correspondência de expressão regular, denotado por ~. Isso é útil para aplicar configurações gerais para o tipo de conteúdo. Se você quiser fazer exceções para locais específicos, você pode usar um bloco de localização normal, que terá precedência sobre uma correspondência de regex.

localização / perfil {
    expira em 2d;
    add_header Cache-Control "público, sem transformação";
}

Você também pode usar o = modificador, que corresponde exatamente aos caminhos e terá precedência sobre uma correspondência de regex e um bloco de localização padrão.

Use Surrogate-Control para modificar o comportamento do CDN

Embora você possa desativar o cache de CDN e ainda aproveitar as vantagens do cache do navegador usando Cache-Control: private, é melhor ter controle direto sobre ele. A maioria dos CDNs respeitará o Surrogate-Control cabeçalho, que funciona exatamente da mesma forma que Cache-Control, exceto que se destina apenas a CDN. Desta forma, você pode dizer ao Fastly para fazer uma coisa e ao usuário fazer outra.

E NGINX, você terá que configurar este cabeçalho manualmente e configurar o max-age valor em vez de usar NGINX expires diretriz.

add_header Surrogate-Control "público, max-age = 86400";
add_header Cache-Control "público, max-age = 120";

Definitivamente, você vai querer testar com seu CDN para verificar se isso funciona.Surrogate-Control é bastante novo e não é universal.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.