Ouvi recentemente que o Nginx adicionou cache ao seu recurso de proxy reverso. Olhei em volta, mas não consegui encontrar muita informação sobre isso.
Quero configurar o Nginx como um proxy reverso de armazenamento em cache na frente do Apache / Django: ter solicitações de proxy do Nginx para algumas (mas não todas) páginas dinâmicas no Apache, armazenar em cache as páginas geradas e servir solicitações subsequentes para essas páginas do cache.
Idealmente, eu gostaria de invalidar o cache de duas maneiras:
- Defina uma data de validade no item em cache
- Para invalidar explicitamente o item em cache. Por exemplo, se meu back-end do 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? Quão?
proxy
nginx
reverse-proxy
varnish
Continuação
fonte
fonte
Respostas:
Não acho que exista uma maneira de invalidar explicitamente itens em cache, mas aqui está um exemplo de como fazer o resto. Atualização: Como 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 - consulte a resposta de Cherian para obter mais informações.
Nesta configuração, os itens que não são armazenados em cache serão recuperados do example.net e armazenados. As versões em cache serão veiculadas para futuros clientes até que não sejam mais válidas (60 minutos).
Seus cabeçalhos HTTP de controle de cache e expiram serão respeitados; portanto, se você desejar definir explicitamente uma data de validade, poderá fazê-lo definindo os cabeçalhos corretos no que você estiver utilizando como proxy.
Há 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
fonte
inactive=600m
significa : Nãoinactive
deveria ser tempo? `[inactive=time]
Você pode invalidar especificamente páginas em cache por meio de
Digamos que você queira armazenar em cache uma página, configure o cache dessa maneira
Agora, quando você deseja invalidar essa página e armazenar em cache novamente
Faça uma chamada secreta com o cabeçalho
Ele será invalidado e armazenado 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.fonte
Eu sugiro que você experimente o Varnish . O verniz foi projetado especificamente como um cache de proxy reverso. Ele respeitará todos os cabeçalhos de controle de cache que você enviar do servidor de origem, o que satisfaz sua primeira solicitação.
Para sua segunda solicitação, invalidação explícita. Minha forte recomendação é alterar o nome do URL do recurso que você deseja invalidar, renomeando o arquivo ou usando alguma forma de buster de cache de string de consulta. O Varnish possui uma
PURGE
operação que removerá o recurso do cache do Varnish, mas não fornecerá controle sobre outros caches 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. Nesse caso, a maneira mais infalível de anular o armazenamento em cache de um recurso é renomeá-lo.fonte
style.v123.css
porque alguns caches não armazenam em cache solicitações que tenham uma sequência de consultas.Para invalidar páginas selecionadas, você pode usar o patch "cache_purge" para o nginx-0.8.x, que faz exatamente o que você deseja;)
Está disponível aqui .
fonte
A maioria das ferramentas de cache (Citrix) permite que uma atualização forçada (Ctrl + r) repovoe uma página em cache.
Aqui está um truque que encontrei para fazer algo semelhante no nginx.
Isso pressupõe que, quando você pressiona Ctrl + r no navegador, o cabeçalho Cache-Control possui max-age = 0 em sua solicitação. 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.fonte
O armazenamento em cache é uma função bastante nova no nginx (e não está tão bem documentada por enquanto), mas estável o suficiente para ser usada na produção.
Use a documentação em inglês
Pergunte nas listas de discussão
Traduza documentação em russo com algo como o Google Translate
Use verniz
fonte
Acredito que NginxHttpProxyModule é capaz de receber solicitações http. Procure as diretrizes começando com:
Sim, é possível controlar o comportamento do cache por meio de diretivas como:
fonte
Com base no fato de que você não consegue encontrar documentos, eu ficaria um pouco cauteloso ao confiar nele na produção. Você já considerou o verniz? É o meu "nginx de proxies reversos", pequeno, leve, fazendo um trabalho e fazendo-o bem.
fonte
Se você usar eTags no seu aplicativo e colocar o nginx na frente dele, ele cuidará da expiração, pois se o eTag mudar, o cache será invalidado.
fonte
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 remoção é realmente interessante, pois esse recurso existe apenas no Nginx Plus (edição comercial do Nginx). Eu realmente gosto da resposta @ 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:
fonte
Para futuros visitantes: enquanto isso, o proxy reverso nginx possui armazenamento em cache integrado e os documentos estão disponíveis em:
fonte
Isso cria cache para / img / location. Está em / opt / nginx-cache. Os objetos são armazenados em cache por 1 minuto.
Você pode escrever códigos de resposta diferentes em vez de qualquer.
Agora você não pode invalidar o cache das páginas selecionadas. Talvez em 0.8.x seja possível.
fonte
Existe um plugin nginx chamado ncache, que afirma ser "um sistema de cache da web baseado no servidor da web nginx. Mais rápido e mais eficiente que o squid".
fonte