Ouvi recentemente que o Nginx adicionou cache ao seu recurso de proxy reverso. Dei uma olhada mas não encontrei muita informação a respeito.
Eu quero configurar o Nginx como um proxy reverso de cache na frente do Apache/Django: ter solicitações de proxy Nginx para algumas (mas não todas) páginas dinâmicas para o Apache, depois armazenar em cache as páginas geradas e atender solicitações subsequentes para essas páginas do cache.
Idealmente, eu gostaria de invalidar o cache de 2 maneiras:
- Definir uma data de expiração no item em cache
- Para invalidar explicitamente o item em cache. Por exemplo, se meu backend Django atualizou certos dados, eu gostaria de dizer ao Nginx para invalidar o cache das páginas afetadas
É possível configurar o Nginx para fazer isso? Como?
Não acho que exista uma maneira de invalidar explicitamente os itens em cache, mas aqui está um exemplo de como fazer o resto. Atualização: Conforme mencionado por Piotr em outra resposta, existe um módulo de limpeza de cache que você pode usar. Você também pode forçar uma atualização de um item em cache usando proxy_cache_bypass do nginx - veja a resposta de Cherian para mais informações.
Nesta configuração, os itens que não são armazenados em cache serão recuperados de example.net e armazenados. As versões em cache serão servidas a futuros clientes até que não sejam mais válidas (60 minutos).
Seus cabeçalhos HTTP Cache-Control e Expires serão respeitados, portanto, se você quiser definir explicitamente uma data de expiração, poderá fazer isso definindo os cabeçalhos corretos em qualquer coisa que esteja fazendo proxy.
Existem muitos parâmetros que você pode ajustar - consulte a documentação do módulo nginx Proxy para obter mais informações sobre tudo isso, incluindo detalhes sobre o significado das diferentes configurações/parâmetros: http://nginx.org/r/proxy_cache_path
Você pode invalidar especificamente páginas em cache por meio de
Digamos que você queira armazenar em cache uma página, defina o cache dessa maneira
Agora, quando você quiser invalidar essa página e armazenar em cache novamente
Faça uma chamada secreta de curl com o cabeçalho
Ele irá invalidá-lo e armazená-lo em cache.
Funciona a partir do nginx 0.7.
Como um bônus adicional,
add_header X-Cache-Status
pode ser usado para verificar se a página é do cache ou não.Sugiro que experimente o Varnish . Varnish é projetado especificamente como um cache de proxy reverso. Ele honrará todos os cabeçalhos de controle de cache que você enviar do servidor de origem, que satisfaça sua primeira solicitação.
Para sua segunda solicitação, invalidação explícita. Minha forte recomendação é alterar o nome da url do recurso que você deseja invalidar, renomeando o arquivo ou usando alguma forma de cache buster de string de consulta. O Varnish tem uma
PURGE
operação que removerá o recurso do cache do Varnish, mas não lhe dará controle sobre nenhum outro cache entre você e o usuário. Como você disse que deseja limpar explicitamente um recurso, os cabeçalhos de controle http padrão não o ajudarão. Nesses casos, a maneira mais infalível de derrotar o cache de um recurso é renomeá-lo.A maioria das ferramentas de cache (Citrix) permite uma atualização forçada (Ctrl+r) para repovoar uma página em cache.
Aqui está um truque que encontrei para fazer algo semelhante no nginx.
Isso pressupõe que quando você faz um Ctrl+r em seu navegador, o cabeçalho Cache-Control tem max-age=0 em sua solicitação. Eu sei que o Chrome faz isso, mas não tentei em outros navegadores. Adicionar mais campos de cabeçalho pode ser fácil, apenas adicionando mais instruções if que definem a
$eac
variável como 1.Para invalidar páginas selecionadas, você pode usar o patch "cache_purge" para nginx-0.8.x, que faz exatamente o que você deseja;)
Está disponível aqui .
O cache é uma função bastante nova no nginx (e não tão bem documentada por enquanto), mas estável o suficiente para ser usada em produção.
Use a documentação em inglês
Pergunte nas listas de discussão
Traduza a documentação russa com algo como o Google Tradutor
Usar verniz
Acredito que o NginxHttpProxyModule seja capaz de fazer cache de solicitações http. Procure as diretivas que começam com:
Sim, é possível controlar o comportamento do cache por meio de diretivas como:
Com base no fato de que você não pode encontrar documentos nele, eu ficaria um pouco cauteloso em confiar nele na produção. Pensou em verniz? É o meu "nginx de proxies reversos", pequeno, leve, fazendo um trabalho e bem feito.
Se você usar eTags em seu aplicativo e colocar nginx na frente dele, ele cuidará da expiração para você, pois se a eTag mudar, invalidará o cache.
Você pode controlar a expiração do cache do Nginx com várias diretivas/parâmetros:
proxy_cache_valid 200 302 10m;
Expires
Cache-Control
X-Accel-Expires
o
inactive
parâmetro naproxy_cache_path
diretiva:proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;
Eu recomendo minha postagem no blog se você quiser saber mais sobre o cache do Nginx.
O tópico de purga é realmente interessante, pois esse recurso existe apenas no Nginx Plus (edição comercial do Nginx). Eu realmente gosto da resposta do @randy-wallace. Mas também existem outras possibilidades como o módulo ngx_cache_purge .
A coisa mais simples que você pode fazer é remover o arquivo em cache manualmente:
gere sua chave de hash:
remova o arquivo do sistema de arquivos: