Cache do navegador Nginx. Cache com Nginx Cache Nginx

16.12.2021

O Nginx pode armazenar solicitações em cache por conta própria. As vantagens de usar o cache Nginx são sua simplicidade em comparação ao Varnish.

O que armazenar em cache?

O objetivo do cache do servidor é evitar a geração constante dos mesmos scripts (por exemplo, um feed de postagem do Wordpress), o que às vezes pode levar segundos inteiros. Em vez disso, o aplicativo gera a página uma vez e o resultado é armazenado na memória. Quando um visitante solicitar a mesma página uma segunda vez, não haverá mais geração e o cliente receberá uma versão armazenada na memória. De vez em quando (chamado ttl), esta versão salva será excluída e uma nova será gerada para manter os dados atualizados.

Quase todos os sites podem armazenar páginas em cache para usuários não autorizados. Adequado para sites com conteúdo disponível publicamente.

Habilitando cache no Nginx

Primeiro de tudo, você precisa determinar o tamanho máximo do cache (o tamanho total de todas as páginas do cache não excederá esse tamanho). Isso é feito no arquivo de configurações principal (nginx.conf) na seção http:

Http ( ... proxy_cache_path /var/cache/nginxlevels=1:2 keys_zone=all:32m max_size=1g ; ... )

# Defina o tamanho do cache para 1G, vamos salvá-lo na pasta /var/cache/nginx

Não se esqueça de criar uma pasta de cache. mkdir /var/cache/nginx

Configurando hosts

Para que o cache funcione, devemos criar um novo host que irá escutar na porta 80. E mova o host principal para alguma outra porta (por exemplo, 81). O host de cache enviará solicitações ao host principal ou servirá dados do cache.

Servidor host de armazenamento em cache ( listen 80; location / ( proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid any 1h; ) )

# Cada página será armazenada em cache por 1 hora

Servidor host principal (listen 81; location / (#fpm etc.))

# Configuração regular apenas na porta 81

Cookies e personalização

Muitos sites usam vários bloqueios pessoais nas páginas. A tecnologia SSI permite cache avançado em casos onde há um grande número de blocos personalizados. Num caso simples, podemos simplesmente desabilitar o cache caso o usuário tenha algum Cookies instalado.

Servidor ( ouvir 80; localização / ( if ($http_cookie ~* ".+") ( set $do_not_cache 1; ) proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid qualquer 1h; ) )

Erros

Também faz sentido ativar o cache de solicitações com falha por um curto período de tempo. Isso evitará tentativas repetidas e frequentes de acessar uma parte quebrada do site.

Servidor ( ouvir 80; localização / ( if ($http_cookie ~* ".+") ( set $do_not_cache 1; ) proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid 404 502 503 1m ; proxy_cache_valid qualquer 1h;

Cache rápido

O Nginx permite armazenar em cache as respostas do fastcgi. Para habilitar este cache, você também deve declarar seus parâmetros (na seção http do arquivo nginx.conf):

Fastcgi_cache_path /var/cache/fpm níveis=1:2 keys_zone=fcgi:32m max_size=1g; fastcgi_cache_key "$scheme$request_method$host$request_uri";

# Defina o tamanho máximo do cache para 1G

Não esqueça de criar a pasta mkdir /var/cache/fpm

Na configuração do host principal, adicione regras de cache:

Servidor ( ouvir 80; localização ~ \.php$ ( fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_cache fcgi; fastcgi_cache_valid 200 60m; ) )

# Neste caso, armazenaremos em cache as respostas com o código 200 por 60 minutos

O mais importante

Aproveite o cache. É muito fácil de configurar, mas pode acelerar seu site dez vezes e economizar recursos.

Todos sabemos que o desempenho de aplicações e websites é um fator crítico para o seu sucesso. O processo para melhorar o desempenho do seu aplicativo ou site, entretanto, nem sempre é claro. A qualidade e a infraestrutura do código são obviamente críticas, mas em muitos casos você pode fazer grandes melhorias na experiência do usuário final do seu aplicativo concentrando-se em algumas técnicas muito básicas de entrega de aplicativos. Um exemplo é implementar e otimizar o cache na pilha de aplicativos. Esta postagem do blog cobre técnicas que podem ajudar usuários novatos e avançados a obter um melhor desempenho ao utilizar o NGINX e o NGINX Plus incluídos.

Visão geral

Um cache de conteúdo fica entre um cliente e um “servidor de origem” e salva cópias de todo o conteúdo que vê. Se um cliente solicitar conteúdo armazenado no cache, ele retornará o conteúdo diretamente, sem entrar em contato com o servidor de origem. Isso melhora o desempenho à medida que o cache de conteúdo está mais próximo do cliente e usa os servidores de aplicativos com mais eficiência, porque eles não precisam fazer o trabalho de gerar páginas do zero todas as vezes.

Existem potencialmente vários caches entre o navegador da Web e o servidor de aplicativos: o cache do navegador do cliente, caches intermediários, redes de distribuição de conteúdo (CDNs) e o balanceador de carga ou proxy reverso situado na frente dos servidores de aplicativos. O armazenamento em cache, mesmo no nível do proxy reverso/balanceador de carga, pode melhorar muito o desempenho.

Por exemplo, no ano passado assumi a tarefa de ajustar o desempenho de um site que carregava lentamente. Uma das primeiras coisas que notei foi que demorou mais de 1 segundo para gerar a página inicial principal. Após alguma depuração, descobri que, como a página estava marcada como não armazenável em cache, ela estava sendo gerada dinamicamente em resposta a cada solicitação. A página em si não mudava com muita frequência e não era personalizada, portanto isso não era necessário. Como experiência, marquei a página inicial para ser armazenada em cache por 5 segundos pelo balanceador de carga, e apenas fazer isso resultou em uma melhoria notável. O tempo para o primeiro byte caiu para alguns milissegundos e a página carregou visivelmente mais rápido.

O NGINX é comumente implantado como um proxy reverso ou balanceador de carga em uma pilha de aplicativos e possui um conjunto completo de recursos de cache. A próxima seção discute como configurar o cache básico com NGINX.

Como instalar e configurar o cache básico

Apenas duas diretivas são necessárias para ativar o cache básico: proxy_cache_path e proxy_cache . A diretiva proxy_cache_path define o caminho e a configuração do cache, e a diretiva proxy_cache o ativa.

proxy_cache_path /caminho/para/níveis de cache=1:2 keys_zone=my_cache:10m max_size=10g inativo=60m use_temp_path=off; servidor ( # ... localização / ( proxy_cache meu_cache; proxy_pass http://my_upstream; ) )

Os parâmetros da diretiva proxy_cache_path definem as seguintes configurações:

  • O diretório do disco local para o cache é chamado /path/to/cache/ .
  • níveis configura uma hierarquia de diretórios de dois níveis em /path/to/cache/ . Ter um grande número de arquivos em um único diretório pode retardar o acesso a arquivos, por isso recomendamos uma hierarquia de diretórios de dois níveis para a maioria das implantações. Se o parâmetro de níveis não estiver incluído, o NGINX colocará todos os arquivos no mesmo diretório.
  • keys_zone configura uma zona de memória compartilhada para armazenar as chaves de cache e metadados, como temporizadores de uso. Ter uma cópia das chaves na memória permite que o NGINX determine rapidamente se uma solicitação é HIT ou MISS sem precisar ir para o disco, acelerando bastante a verificação. Uma zona de 1 MB pode armazenar dados de cerca de 8.000 chaves, portanto, a zona de 10 MB configurada no exemplo pode armazenar dados de cerca de 80.000 chaves.
  • max_size define o limite superior do tamanho do cache (para 10 gigabytes neste exemplo). É opcional; não especificar um valor permite que o cache cresça para usar todo o espaço disponível em disco. Quando o tamanho do cache atinge o limite, um processo chamado gerenciador de cache remove os arquivos que foram usados ​​menos recentemente para trazer o tamanho do cache de volta ao limite.
  • inativo especifica quanto tempo um item pode permanecer no cache sem ser acessado. Neste exemplo, um arquivo que não foi solicitado por 60 minutos é automaticamente excluído do cache pelo processo do gerenciador de cache, independentemente de ter expirado ou não. O valor padrão é 10 minutos (10m). O conteúdo inativo difere do conteúdo expirado. O NGINX não exclui automaticamente o conteúdo que expirou conforme definido por um cabeçalho de controle de cache (Cache-Control:max-age=120 por exemplo). O conteúdo expirado (obsoleto) é excluído somente quando não foi acessado durante o tempo especificado por inactive . Quando o conteúdo expirado é acessado, o NGINX o atualiza no servidor de origem e redefine o temporizador inativo.
  • O NGINX primeiro grava os arquivos destinados ao cache em uma área de armazenamento temporário, e a diretiva use_temp_path=off instrui o NGINX a gravá-los nos mesmos diretórios onde serão armazenados em cache. Recomendamos que você desative esse parâmetro para evitar cópias desnecessárias de dados entre sistemas de arquivos. use_temp_path foi introduzido no NGINX versão 1.7.10 e .

E, finalmente, a diretiva proxy_cache ativa o cache de todo o conteúdo que corresponde à URL do bloco de localização pai (no exemplo, / ). Você também pode incluir a diretiva proxy_cache em um bloco de servidor; aplica-se a todos os blocos de localização do servidor que não possuem sua própria diretiva proxy_cache.

Entregando conteúdo em cache quando o local de origem está inativo / ( # ... proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; )

Com esta configuração de exemplo, se o NGINX receber um error , timeout ou qualquer um dos erros 5xx especificados do servidor de origem e tiver uma versão obsoleta do arquivo solicitado em seu cache, ele entregará o arquivo obsoleto em vez de retransmitir o erro para o cliente.

Ajustando o cache e melhorando o desempenho

O NGINX possui diversas configurações opcionais para ajustar o desempenho do cache. Aqui está um exemplo que ativa alguns deles:

Proxy_cache_path /caminho/para/níveis de cache=1:2 keys_zone=my_cache:10m max_size=10g inativo=60m use_temp_path=off; server ( # ... location / ( proxy_cache my_cache; proxy_cache_revalidate on; proxy_cache_min_uses 3; proxy_cache_use_stale tempo limite de erro atualizando http_500 http_502 http_503 http_504; proxy_cache_background_update on; proxy_cache_lock on; proxy_pass http://my_upstream; ) )

Estas diretivas configuram o seguinte comportamento:

  • proxy_cache_revalidate instrui o NGINX a usar solicitações GET condicionais ao atualizar o conteúdo dos servidores de origem. Se um cliente solicitar um item armazenado em cache, mas expirado conforme definido pelos cabeçalhos de controle de cache, o NGINX incluirá o campo If-Modified-Since no cabeçalho da solicitação GET que ele envia ao servidor de origem. Isso economiza largura de banda, porque o servidor envia o item completo somente se ele tiver sido modificado desde o horário registrado no cabeçalho Last-Modified anexado ao arquivo quando o NGINX o armazenou originalmente em cache.
  • proxy_cache_min_uses define o número de vezes que um item deve ser solicitado pelos clientes antes que o NGINX o armazene em cache. Isso é útil se o cache estiver constantemente cheio, pois garante que apenas os itens acessados ​​com mais frequência sejam adicionados ao cache. Por padrão, proxy_cache_min_uses é definido como 1.
  • O parâmetro de atualização da diretiva proxy_cache_use_stale, combinado com a ativação da diretiva proxy_cache_background_update, instrui o NGINX a entregar conteúdo obsoleto quando os clientes solicitam um item que está expirado ou em processo de atualização no servidor de origem. Todas as atualizações serão feitas em segundo plano. O arquivo obsoleto é retornado para todas as solicitações até que o download do arquivo atualizado seja completo.
  • Com proxy_cache_lock ativado, se vários clientes solicitarem um arquivo que não esteja atual no cache (um MISS), apenas a primeira dessas solicitações será permitida no servidor de origem. O restante espera que essa solicitação seja atendida e, em seguida, extraia o arquivo do cache. Sem proxy_cache_lock ativado, todas as solicitações que resultam em falhas de cache vão direto para o servidor de origem.
Dividindo o cache em vários discos rígidos

Se você tiver vários discos rígidos, o NGINX poderá ser usado para dividir o cache entre eles. Aqui está um exemplo que divide os clientes igualmente em dois discos rígidos com base no URI da solicitação:

Proxy_cache_path /caminho/para/hdd1 níveis=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inativo=60m use_temp_path=off; proxy_cache_path /caminho/para/hdd2 níveis=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inativo=60m use_temp_path=off; split_clients $request_uri $my_cache ( 50% “my_cache_hdd1”; 50% “my_cache_hdd2”; ) servidor ( # ... localização / ( proxy_cache $my_cache; proxy_pass http://my_upstream; ) )

As duas diretivas proxy_cache_path definem dois caches (my_cache_hdd1 e my_cache_hdd2) em dois discos rígidos diferentes. O bloco de configuração split_clients especifica que os resultados de metade das solicitações (50%) são armazenados em cache em my_cache_hdd1 e a outra metade em my_cache_hdd2 . O hash baseado na variável $request_uri (o URI da solicitação) determina qual cache é usado para cada solicitação, o resultado é que as solicitações para um determinado URI são sempre armazenadas no mesmo cache.

Observe que esta abordagem não substitui uma configuração de disco rígido RAID. Se houver uma falha no disco rígido, isso poderá levar a um comportamento imprevisível no sistema, incluindo os usuários vendo 500 códigos de resposta para solicitações direcionadas ao disco rígido com falha. Uma configuração adequada do disco rígido RAID pode lidar com falhas no disco rígido.

Perguntas frequentes (FAQ)

Esta seção responde a algumas perguntas frequentes sobre o cache de conteúdo do NGINX.

O cache NGINX pode ser instrumentado? add_header X-Cache-Status $upstream_cache_status;

Este exemplo adiciona um cabeçalho HTTP X-Cache-Status nas respostas aos clientes. A seguir estão os valores possíveis para $upstream_cache_status :

Como o NGINX determina se deve ou não armazenar algo em cache?

Por padrão, o NGINX respeita os cabeçalhos Cache-Control dos servidores de origem. Ele não armazena em cache respostas com Cache-Control definido como Private , No-Cache ou No-Store ou com Set-Cookie no cabeçalho de resposta. O NGINX armazena em cache apenas solicitações de clientes GET e HEAD. Você pode substituir esses padrões conforme descrito nas respostas abaixo.

proxy_cache_methods GET HEAD POST;

Este exemplo permite o armazenamento em cache de solicitações POST.

O NGINX pode armazenar conteúdo dinâmico em cache?

Sim, desde que o cabeçalho Cache-Control permita isso. O armazenamento em cache de conteúdo dinâmico, mesmo por um curto período de tempo, pode reduzir a carga nos servidores e bancos de dados de origem, o que melhora o tempo até o primeiro byte, já que a página não precisa ser regenerada para cada solicitação.

Posso fazer um buraco no meu cache? localização / ( proxy_cache_bypass $cookie_nocache $arg_nocache; # ... )

A diretiva define os tipos de solicitação para os quais o NGINX solicita conteúdo do servidor de origem imediatamente, em vez de tentar encontrá-lo primeiro no cache. Isso às vezes é chamado de “perfurar um buraco” no cache. Neste exemplo, o NGINX faz isso para solicitações com um cookie ou argumento nocache, por exemplo http://www.example.com/?nocache=true . O NGINX ainda pode armazenar em cache a resposta resultante para solicitações futuras que não sejam ignoradas.

Qual chave de cache o NGINX usa?

A forma padrão das chaves que o NGINX gera é semelhante a um hash MD5 das seguintes variáveis ​​NGINX: $scheme$proxy_host$request_uri ; o algoritmo real usado é um pouco mais complicado.

Proxy_cache_path /caminho/para/níveis de cache=1:2 keys_zone=my_cache:10m max_size=10g inativo=60m use_temp_path=off; servidor ( # ... localização / ( proxy_cache meu_cache; proxy_pass http://my_upstream; ) )

Para este exemplo de configuração, a chave de cache para http://www.example.org/my_image.jpg é calculada como md5(“http://my_upstream:80/my_image.jpg”) .

Para alterar as variáveis ​​(ou outros termos) usadas como base para a chave, use a diretiva proxy_cache_key (veja também a pergunta a seguir).

Posso usar um cookie como parte da minha chave de cache?

Sim, a chave de cache pode ser configurada para qualquer valor arbitrário, por exemplo:

proxy_cache_key $proxy_host$request_uri$cookie_jessionid;

Este exemplo incorpora o valor do cookie JSESSIONID na chave de cache. Itens com o mesmo URI, mas com valores JSESSIONID diferentes, são armazenados em cache separadamente como itens exclusivos.

O NGINX usa o cabeçalho ETag? Como o NGINX lida com o cabeçalho Pragma?

O cabeçalho Pragma:no-cache é adicionado pelos clientes para ignorar todos os caches intermediários e ir direto para o servidor de origem para obter o conteúdo solicitado. O NGINX não respeita o cabeçalho Pragma por padrão, mas você pode configurar o recurso com a seguinte diretiva proxy_cache_bypass:

Localização /imagens/ ( proxy_cache my_cache; proxy_cache_bypass $http_pragma; # ... )

O NGINX oferece suporte às extensões obsoletas enquanto revalidam e obsoletas se houver erro para o cabeçalho Cache-Control? O NGINX oferece suporte ao cabeçalho Vary? Leitura adicional

Existem muitas outras maneiras de personalizar e ajustar o cache do NGINX. Para saber ainda mais sobre armazenamento em cache com NGINX, dê uma olhada nos seguintes recursos:

  • A documentação de referência do ngx_http_proxy_module contém todas as opções de configuração para cache de conteúdo.
  • Dois webinars estão disponíveis sob demanda e abordam muitas das informações apresentadas nesta postagem do blog: e.
  • O Guia de administração do NGINX Plus contém mais exemplos de configuração e informações sobre como ajustar o cache do NGINX.
  • A página do produto contém uma visão geral sobre como configurar a limpeza de cache com NGINX Plus e fornece outros exemplos de personalização de cache.
  • O e-book fornece um aprofundamento completo sobre o cache de conteúdo do NGINX.

O cache de dados do lado do cliente é a capacidade de configurar um download único de dados de um determinado tipo e salvá-los na memória do cliente. Armazenar em cache o navegador nginx ou usar outro servidor permite reduzir o número de solicitações da máquina cliente e, consequentemente, a carga, além de aumentar a velocidade de carregamento dos sites.

Aqueles. o cliente acessa a página do site - o servidor processa a solicitação, a página gerada é enviada ao cliente junto com um determinado cabeçalho. O navegador armazena as informações localmente e as retorna quando solicitadas novamente.

Imagens de estilo CSS e Javascript são armazenadas em cache. O cache do navegador Nginx é implementado adicionando o cabeçalho Cache-control.

Nos cabeçalhos, as informações de serviço são transmitidas do servidor para o navegador cliente, a partir do qual o navegador aprende quando precisa salvar dados de um determinado tipo e por quanto tempo mantê-los na memória.

Cache do navegador Nginx

No arquivo de configuração Nginx, o cache JS/CSS é habilitado da seguinte forma (outras extensões foram adicionadas - na prática, é melhor armazenar todas em cache):

servidor(

localização ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ (
expira no máximo;
root /home/website/example.com/;
}

}

expira max significa que o TTL está definido para infinito e se os arquivos no servidor forem alterados, o cliente nunca saberá disso, pois uma solicitação repetida não será enviada.

expira (este cabeçalho será discutido abaixo) determina quando o navegador atualizará o cache, o valor é definido em segundos.

Normalmente, o valor máximo de expiração é definido na configuração do servidor, então na aplicação, ao conectar os arquivos css e js, são determinadas suas versões, que devem mudar sempre que o conteúdo for atualizado.

Especificando cabeçalhos de cache no nível do aplicativo

O servidor, neste caso, perceberá cada nova versão como um novo arquivo adicionado e irá armazená-lo em cache.

Junto com Cache-Control, o cabeçalho Expires é frequentemente especificado - ele força a data e hora em que o navegador redefinirá o cache existente; na próxima vez que o usuário entrar em contato, os dados atualizados serão carregados novamente no cache.

O cabeçalho HTTP Expires adicional especifica a data e hora em que o navegador deve atualizar o cache (os cabeçalhos podem ser usados ​​juntos; Expires tem um valor menor quando ambos os cabeçalhos são usados):

Ambos os cabeçalhos podem ser definidos no código no nível do aplicativo.

Habilitando cache em PHP

A maioria dos projetos da web são escritos na linguagem PHP, os cabeçalhos HTTP Cache-control e Expires são definidos da seguinte forma: