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 NginxPrimeiro 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 hostsPara 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çãoMuitos 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; ) )
ErrosTambé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ápidoO 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 importanteAproveite 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 geralUm 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ásicoApenas 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:
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 desempenhoO 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:
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 adicionalExistem 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:
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 NginxNo 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 PHPA 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: