Como limpar o cache de nginx?

250

Eu uso o nginx como servidor frontal, modifiquei os arquivos CSS, mas o nginx ainda está servindo os antigos.

Tentei reiniciar o nginx, sem sucesso, e pesquisei no Google, mas não encontrei uma maneira válida de limpá-lo.

Alguns artigos dizem que podemos simplesmente excluir o diretório de cache:, var/cache/nginxmas não existe esse diretório no meu servidor.

O que eu deveria fazer agora?

Vento livre
fonte
1
Mais detalhes sobre sua configuração do Nginx seriam de grande ajuda. Você está usando proxy_cache?
Alexander Azarov
Não, eu só usou a configuração padrão, e eu procurei sobre corda cache, não achei nos arquivos de configuração
Freewind
5
O Nginx não faz cache por padrão.
Alexander Azarov
30
Você está executando em um virtualbox / vargant vm? Nesse caso, tente desativar o sendfile, pois eles não funcionam bem juntos.
kolbyjack
5
você tem certeza de que o cache está do lado do nginx? Você verificou o comportamento com uma ferramenta como curl? Muitas vezes, um problema como esse é apenas o cache do lado do cliente, não solicitando um recurso atualizado, porque foi informado que o recurso antigo será válido por um longo período de tempo até expirar no máximo; ou algo semelhante.
kolbyjack

Respostas:

185

Eu tive exatamente o mesmo problema - eu estava executando meu nginx no Virtualbox. Eu não tinha o cache ativado. Mas parece que sendfilefoi definido para onem nginx.confe que estava causando o problema. @kolbyjack mencionou isso acima nos comentários.

Quando eu desliguei sendfile- funcionou bem.

Isto é porque:

O Sendfile é usado para 'copiar dados entre um descritor de arquivo e outro' e aparentemente apresenta alguns problemas reais quando executado em um ambiente de máquina virtual, ou pelo menos quando executado através do Virtualbox. Desativar essa configuração no nginx faz com que o arquivo estático seja veiculado por um método diferente e suas alterações serão refletidas imediatamente e sem questionar

Está relacionado a este bug: https://www.virtualbox.org/ticket/12597

Deepan Chakravarthy
fonte
7
Consulte este link
Sian Lerk Lau
No meu caso, a solução alternativa é ativar o gzip para esses tipos de arquivo. De qualquer maneira, o problema está resolvido.
Dingle
Muito obrigado e Kolbyjack pela resposta. Salvou a minha vida.
T1000 27/01
1
Eu usei seguinte 'sudo vim /etc/nginx/nginx.conf' e mudança 'sendfile on' para 'SENDFILE off'
Koray Güçlü
12
Eu desliguei o sendfile. Sem sorte
Marukobotto # 21/16
110

Você também pode ignorar / re-armazenar em cache arquivo por arquivo usando

proxy_cache_bypass $http_secret_header;

e como bônus, você pode retornar esse cabeçalho para ver se o obteve no cache (retornará 'HIT') ou no servidor de conteúdo (retornará 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

para expirar / atualizar o arquivo em cache, use curl ou qualquer outro cliente restante para fazer uma solicitação para a página em cache.

curl http://abcdomain.com/mypage.html -s -I -H "secret-header:true"

isso retornará uma nova cópia do item e também substituirá o que está no cache.

Jason Wiener
fonte
7
Por que só posso votar desta vez? Eu quero fazer um zilhão :)
Spock
2
Isso só pode atualizar páginas em cache quando a nova página também é armazenável em cache. Se você removeu uma página (404 ou outros erros agora são exibidos pelo back-end), a página agora envia um cabeçalho Set-Cookie ou "Content-Control: private", o conteúdo em cache não será "invalidado".
Rbu
3
Este "add_header X-Cache-Status $ upstream_cache_status;" é um recurso tão legal!
Maxim Masiutin
1
Muito obrigado. boa dica para invalidação de cache, não é tão pequenos tutoriais sobre nginx
Ivan Semochkin
4
Isso mudou desde que você postou? Eu com êxito pode obter uma nova cópia com o "segredo-header", mas assim que eu remover o cabeçalho, fico com a versão em cache de novo ...
pLuc
60

A menos que você tenha configurado uma zona de cache via proxy_cache_path e depois a usado (por exemplo, em um bloco de localização), via: proxy_cache nada será armazenado em cache.

Se você fez isso, no entanto, de acordo com o autor do nginx , basta remover todos os arquivos do diretório de cache.

Maneira mais simples: find /path/to/your/cache -type f -delete

Gnarfoz
fonte
Estou recebendo isso no meu log de erros depois de excluir os arquivos:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson
Repetidamente, ou apenas uma vez? Não deve ser um problema real. Provavelmente, apenas significa que o gerenciador de cache tentou excluir um arquivo que você já excluiu. Talvez recarregar o nginx (nginx -s reload) possa ajudar se você receber a mensagem repetidamente. (Não tenho certeza se isso reinicializa o Gerenciador de cache, também.)
Gnarfoz
1
sim, limpo automaticamente o cache do meu site por um script sempre que implanto uma alteração, e recarregar o nginx também não a corrige.
22413 Collin Anderson
Nop Nginx armazena em cache algo, mesmo que você não use itens de proxy, mas é um bug do Nginx + VirtualBox.
Thomas Decaux
1
Isso parece bastante vago. Você poderia elaborar isso? Não parece que esteja relacionado ao tópico em questão aqui.
Gnarfoz 02/09
20

Você pode excluir o diretório de cache do nginx ou pesquisar um arquivo específico:

grep -lr 'http://mydomain.pl/css/myedited.css' /var/nginx/cache/*

E exclua apenas um arquivo para o nginx atualizá-los.

Łukasz Sokolik
fonte
1
Para obter o resultado exato, você pode acrescentar $ ao termo de pesquisa. Comogrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang
1
Infelizmente, obtive a seguinte saída grep: /var/nginx/cache/*: No such file or directory: estou usando o Ubuntu 14.04.3 LTS e o nginx / 1.8.1. Qualquer ideia?
B00r00x0
Tente o seguinte para grep arquivos em / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau
Eu acredito que é / var / cache / nginx / * (cache dir antes do nginx no caminho)
Randy Lam
15

Há duas respostas nesta pergunta.

  • Um para nginx como cache reverso
  • Outro para limpar o cache do navegador pela entrada do cabeçalho (este)

Usar:

expires modified +90d;

POR EXEMPLO:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
deyes
fonte
Eu tentei esta implementação porque estou tendo um problema semelhante. No entanto, depois que eu fiz a alteração, ela mostra a página padrão do Nginx. Estou usando o Niginx como LB com proxy, talvez precise alterar o root, talvez?
Aaron
10

Eu achei isso útil

grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm

Pesquise e, se encontrado, exclua.

agustik
fonte
9

Na minha instalação do nginx, descobri que tinha que ir para:

/opt/nginx/cache

e

sudo rm -rf *

nesse diretório. Se você conhece o caminho para a instalação do nginx e pode encontrar o diretório de cache, o mesmo pode funcionar para você. Tenha muito cuidado com o rm -rfcomando, se você estiver no diretório errado, poderá excluir todo o seu disco rígido.

Ganesh Shankar
fonte
2
você precisa reiniciar o NGINX depois disso #
Eliel Haouzi 21/09
E essa é a parte ruim
Kidz
9

Eu executo um script bash muito simples que leva 10 segundos para fazer o trabalho e me envia um email quando terminar.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" [email protected]
exit 0
MitchellK
fonte
8

Eu também tive esse problema.

  • Não foi possível encontrar nenhuma pasta nginx / cache
  • sendfile estava desativado

Meu domínio usa cloudflare.com para DNS (ótimo serviço!). Aha! Lá estava:

cloudflare.com -> cache -> Limpar cache (limpei tudo) Isso resolveu meu problema!

Asle
fonte
2
Isso limpa os caches de borda do Cloudflare. Não limpa o cache do Nginx no seu próprio servidor.
mahemoff
Como um conselho, acho que é uma resposta válida.
Fernando Kosh
Essa foi uma excelente resposta. Eu estava pesquisando horas por que alguns arquivos ainda estão sendo armazenados em cache e não conseguia adivinhar que era "falha" do CloudFlare. Obrigado!
Undefinedman
6

Temos um cache nginx muito grande (gigabytes) que ocasionalmente precisamos limpar. Elaborei um script que limpa instantaneamente o cache (no que diz respeito ao Nginx) e remove o diretório de cache sem passar fome pelo aplicativo principal de E / S do disco.

Em suma:

  1. Mova a pasta de cache para um novo local (no mesmo sistema de arquivos!) (Isso não interrompe nenhum descritor de arquivo aberto)
  2. Recrie a pasta de cache original, vazia
  3. Recarregar Nginx ( graciosa recarga, onde nginx permite que os trabalhadores antigos terminar solicitações em andamento)
  4. Remover dados antigos em cache

Aqui está o script, adaptado ao Ubuntu 16.04 LTS, com o cache localizado em /mnt/nginx-cache:

#!/bin/bash
set -e

TMPCACHE=`mktemp --directory --tmpdir=/mnt nginx-cache-XXXXXXXXXX`
TMPTEMP=`mktemp --directory --tmpdir=/mnt nginx-temp-XXXXXXXXXX`

# Move the old cache folders out of the way
mv /mnt/nginx-cache $TMPCACHE
mkdir -p /mnt/nginx-cache
chmod -R 775 /mnt/nginx-cache
chown www-data:www-data /mnt/nginx-cache

mv /mnt/nginx-temp $TMPTEMP
mkdir -p /mnt/nginx-temp
chmod -R 775 /mnt/nginx-temp
chown www-data:www-data /mnt/nginx-temp

# Tell Nginx about the new folders.
service nginx reload

# Create an empty folder.
rm -rf /mnt/empty
mkdir -p /mnt/empty

# Remove the old cache and old temp folders w/o thrashing the disk...
# See http://serverfault.com/questions/546177/how-to-keep-subtree-removal-rm-rf-from-starving-other-processes-for-disk-i
# Note: the `ionice` and `nice` may not actually do much, but why not?
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPCACHE
ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ $TMPTEMP
rm -rf $TMPCACHE
rm -rf $TMPTEMP

rm -rf /mnt/empty

E, caso seja útil, aqui está a configuração do Nginx que usamos:

upstream myapp {
    server localhost:1337 fail_timeout=0;
}

proxy_cache_path /mnt/nginx-cache/app levels=2:2:2 keys_zone=app_cache:100m inactive=1y max_size=10g;
proxy_temp_path  /mnt/nginx-temp/app;

server {
    listen   4316 default;
    server_name  myapp.com;

    location / {
        proxy_pass http://appserv;
        proxy_cache app_cache;
        proxy_cache_valid 200 1y;
        proxy_cache_valid 404 1m;
    }
}
David Eyk
fonte
5

Para quem outras soluções não estão funcionando, verifique se você está usando um serviço DNS como o CloudFlare . Nesse caso, ative o "Modo de desenvolvimento" ou use a ferramenta "Limpar cache".

Leopoldo Sanczyk
fonte
5

Observe que proxy_cache_bypass pode causar um mundo de mágoa se o seu aplicativo não retornar uma resposta armazenável em cache para essa solicitação específica em que você a acionar.

Se, por exemplo, seu aplicativo enviar um cookie a cada primeira solicitação, provavelmente um script que aciona proxy_pass_bypass via curl provavelmente obterá esse cookie na resposta, e o nginx não usará essa resposta para atualizar o item em cache.

dwt
fonte
3
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

Tenha cuidado para especificar corretamente o caminho correto.

colapsnux
fonte
3

Para aqueles que tentaram excluir os arquivos de cache nginx, e eles não funcionaram ou funcionaram intermitentemente, dê uma olhada na sua configuração para open_file_cache. Se isso estiver ativado e configurado para armazenar em cache um descritor de arquivo por um longo tempo, o Nginx ainda poderá ver uma versão do arquivo em cache, mesmo depois de excluí-lo do disco. Eu tive que reduzir o open_file_cache_valid para 1s (não tenho certeza se isso é essencialmente o mesmo que desabilitar completamente o cache do arquivo).

SilentMiles
fonte
2

No meu servidor, a pasta cache do nginx está em /data/nginx/cache/

Então eu o removi apenas: sudo rm -rf /data/nginx/cache/

Espero que isso ajude alguém.

Brilliant-DucN
fonte
2

Se você deseja limpar o cache de arquivos específicos, pode usar a proxy_cache_bypassdiretiva. é assim que se faz

location / {
    proxy_cache_bypass $cookie_nocache $arg_nocache;
    # ...
}

Agora, se você quiser ignorar o cache, acesse o arquivo passando o parâmetro nocache

http://www.example.com/app.css?nocache=true

Sajjad Ashraf
fonte
1
Eu acho que isso pode ser usado para atacar e consumir largura de banda no seu site.
Marcelo Agimóvel 11/02/19
1
Isso simplesmente ignora o cache da solicitação atual ( app.css?nocache=true) enquanto o arquivo original (sem consulta) permanece no cache ( app.css)?
precisa saber é o seguinte
1

Você pode adicionar a configuração no nginx.conf como a seguir.

...
http {
proxy_cache_path  /tmp/nginx_cache levels=1:2 keys_zone=my-test-cache:8m max_size=5000m inactive=300m;

server {
    proxy_set_header X- Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_cache my-test-cache;
    proxy_cache_valid  200 302  1m;
    proxy_cache_valid  404      60m;
    proxy_cache_use_stale   error timeout invalid_header updating;
    proxy_redirect off;

    ....
}
...
}

Acima, uma pasta chamada "nginx_cache" é criada dinamicamente em / tmp / para armazenar conteúdo em cache.

austinzmchen
fonte
1

Existe um método certo para remover apenas arquivos de cache, que corresponde a qualquer KEY. Por exemplo:

grep -lr 'KEY: yahoo' /var/lib/nginx/cache | xargs rm -rf

Isso remove todos os arquivos de cache, que correspondem a KEY "yahoo / *", se no nginx.conf estiver definido:

proxy_cache_key $host$uri;
Ivan BlaBlaBla
fonte
1

Usamos o nginx para armazenar muitas coisas em cache. Existem dezenas de milhares de itens no diretório de cache. Para encontrar itens e excluí-los, desenvolvemos alguns scripts para simplificar esse processo. Você pode encontrar o repositório para esses scripts abaixo:

https://github.com/zafergurel/nginx-cache-cleaner

A ideia é simples. Para criar um índice do cache (com chaves de cache e arquivos de cache correspondentes) e pesquise nesse arquivo de índice. Realmente nos ajudou a acelerar a localização de itens (de minutos a segundos) e excluí-los de acordo.

Zafer
fonte
1

No meu caso, touchesse arquivo CSS, parece que os recursos foram alterados (na verdade touch, nada faz no arquivo, exceto a hora da última modificação), para que o navegador e o nginx apliquem os recursos mais recentes

Noé
fonte
0

Eu estava enfrentando um tipo de problema semelhante:

Configuração do sistema e problema: (Em uma caixa virtual, eu estou hospedando na web usando o ubuntu e o nginx - as atualizações da página PHP não refletiam alterações no arquivo css externo). Estou desenvolvendo site na máquina Windows e transferindo arquivos para o nginx via pasta compartilhada. Parece que o nginx não capta as alterações no arquivo css (atualizar de qualquer forma não ajuda. Alterar o nome do arquivo css é apenas algo que funcionou)

Solução: Na VM, encontre o arquivo compartilhado (arquivo css no meu caso). Abra com o nano e compare com o arquivo no compartilhamento do Windows (eles parecem idênticos). Na VM, salve o arquivo compartilhado com o nano. Todas as alterações agora são refletidas no navegador. Não sei por que isso funciona, mas funcionou no meu caso.

ATUALIZAÇÃO: Após reiniciar o servidor da VM, o problema retornou. Seguir as instruções em Solução tornou o css responsivo a atualizações novamente

Mr G
fonte
-1

No meu caso, foi o opcache ativado no /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Configurá-lo como 0 fez o servidor carregar a versão mais recente dos arquivos (php).

Louco por tecnologia
fonte