Comment vider la cache de nginx?

j'utilise nginx comme serveur front, j'ai modifié les fichiers CSS, mais nginx est toujours au service de l'ancien.

j'ai essayé de redémarrer nginx, sans succès et j'ai Googlé, mais ne trouve pas un moyen valable pour l'effacer.

certains articles disent que nous pouvons simplement supprimer le répertoire cache: var/cache/nginx , mais il n'y a pas de Tel répertoire sur mon serveur.

Que dois-je faire maintenant?

194
demandé sur Teun Zengerink 2011-06-04 14:04:30

18 réponses

j'ai eu exactement le même problème - j'exécutais mon nginx dans Virtualbox. Je n'ai pas de mise en cache activée. Mais on dirait que sendfile a été mis à on dans nginx.conf et cela a causé le problème. @kolbyjack mentionné ci-dessus dans les commentaires.

quand j'ai éteint sendfile - ça a bien marché.

c'est parce que:

Sendfile est utilisé pour ' copier des données entre un descripteur de fichier et un autre‘ et a apparemment de réels problèmes lorsqu'il est exécuté dans un environnement de machine virtuelle, ou du moins Lorsqu'il est exécuté dans Virtualbox. Si vous désactivez cette configuration dans nginx, le fichier statique sera servi par une méthode différente et vos modifications seront reflétées immédiatement et sans question

166
répondu Deepan Chakravarthy 2016-04-13 13:33:53

vous pouvez également contourner / re-cache sur une base fichier par fichier en utilisant

proxy_cache_bypass $http_secret_header;

et en prime, vous pouvez retourner cet en-tête pour voir si vous l'avez reçu du cache (retournera 'HIT') ou du serveur de contenu (retournera 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

pour expirer/rafraîchir le fichier mis en cache, utilisez curl ou tout autre client rest pour faire une requête à la page Mise en cache.

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

cela permettra de retourner une nouvelle copie de l'article et il allons remplacer ce qui est dans le cache.

78
répondu Jason Wiener 2014-05-21 04:58:27

sauf si vous avez configuré une zone de cache via proxy_cache_path et l'avez ensuite utilisée (par exemple dans un bloc de localisation), via: proxy_cache rien ne sera mis en cache.

si vous l'avez fait, alors selon l'auteur de nginx , il suffit de supprimer tous les fichiers du répertoire cache.

la manière la plus simple: find /path/to/your/cache -type f -delete

52
répondu Gnarfoz 2011-08-01 10:07:57

vous pouvez supprimer le répertoire cache de nginx ou vous pouvez rechercher un fichier spécifique:

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

et supprimer un seul fichier pour les rafraîchir.

18
répondu Łukasz Sokolik 2012-10-01 08:20:45

il y a deux réponses à cette question.

  • Un pour nginx inverse cache
  • un Autre pour nettoyer le cache du navigateur en-tête d'entrée (celui-ci)

Utiliser:

expires modified +90d;

E. G.:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
13
répondu deyes 2014-06-13 18:52:54

dans mon installation nginx j'ai trouvé que je devais aller à:

/opt/nginx/cache

et

sudo rm -rf *

dans ce répertoire. Si vous connaissez le chemin vers votre installation nginx et que vous pouvez trouver le répertoire de cache, cela peut fonctionner pour vous. Être très prudent avec la commande rm -rf , si vous êtes dans le mauvais répertoire, vous pouvez supprimer l'ensemble de votre disque dur.

10
répondu Ganesh Shankar 2013-07-16 14:57:06

j'ai trouvé cela utile

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

rechercher, et si trouvé puis supprimer.

10
répondu agustik 2013-10-19 22:35:26

pour ceux dont les autres solutions ne fonctionnent pas, vérifiez si vous utilisez un service DNS comme CloudFlare . Dans ce cas, activez le "Mode de développement" ou utilisez l'outil "Purge Cache".

5
répondu Leopoldo Sanczyk 2015-09-18 07:07:32

s'il vous plaît prendre note que proxy_cache_bypass peut vous donner un monde de mal si votre application ne renvoie pas une réponse cachable pour cette requête spécifique où vous le déclenchez.

si par exemple votre application envoie un cookie avec chaque première requête, alors un script qui déclenche proxy_pass_bypass via curl va probablement obtenir ce cookie dans la réponse, et nginx va et non utiliser cette réponse pour rafraîchir l'élément mis en cache.

4
répondu dwt 2016-02-02 10:17:07

j'exécute un script de bash très simple qui prend tout de 10 secondes pour faire le travail et m'envoie un mail quand c'est fait.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" me@gmail.com
exit 0
4
répondu MitchellK 2017-03-24 13:21:00
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

veillez à spécifier correctement le chemin correct.

3
répondu colapsnux 2016-01-03 14:27:43

pour ceux qui ont essayé de supprimer les fichiers cache de nginx, et soit cela n'a pas fonctionné, soit cela a fonctionné de façon intermittente, regardez votre paramètre pour open_file_cache. Si cela est activé et configuré pour mettre en cache un descripteur de fichier pendant une longue période, Alors Nginx peut toujours voir une version du fichier mis en cache, même après que vous l'ayez supprimé du disque. J'ai dû réduire open_file_cache_valid à 1s (Je ne suis pas sûr que ce soit essentiellement la même chose que de désactiver complètement le cache du fichier).

3
répondu SilentMiles 2016-05-18 02:00:46

j'ai eu ce problème aussi.

  • ne Pouvait pas trouver un nginx/dossier cache
  • sendfile était à l'arrêt

mon domaine utilise cloudflare.com pour DNS (grand service!). Aha! Il était là:

cloudflare.com -> cache> vider la mémoire Cache (j'ai purgé tout) Qui a résolu mon problème!

3
répondu Asle 2017-01-19 09:39:24

vous pouvez ajouter la configuration dans nginx.conf comme suit.

...
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;

    ....
}
...
}

D'en haut, un dossier nommé" nginx_cache " est dynamiquement créé dans /tmp/ pour stocker du contenu caché.

1
répondu austinzmchen 2014-04-07 03:53:22

sur mon serveur, le dossier cache de nginx est à /data/nginx/cache/

donc je l'ai enlevé seulement: sudo rm -rf /data/nginx/cache/

espérons que cela aidera n'importe qui.

1
répondu Brilliant 2015-05-13 01:47:24

il y a une bonne méthode pour supprimer seulement les fichiers cache, qui correspondent à n'importe quelle clé. Par exemple:

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

cela supprime tous les fichiers cache, qui correspondent à la touche" yahoo/*", si dans Nginx.conf a été mis:

proxy_cache_key $host$uri;
0
répondu Ivan BlaBlaBla 2015-02-24 19:21:15

j'ai été confronté à un type de problème similaire:

installation du système et problème: (Sur une virtualbox que j'héberge en utilisant ubuntu et la page Web de Nginx-PHP, les mises à jour ne reflètent pas les modifications apportées au fichier CSS externe). Je développe le site web sur windows machine et le transfert de fichiers à nginx via le dossier partagé. Il semble que nginx ne capte pas les changements au fichier css (rafraîchissant d'une manière ou d'une autre n'aide pas. Changer le nom du fichier css est la seule chose qui ouvré

Solution: Sur VM trouver le fichier partagé (fichier css dans mon cas). Ouvrez avec nano et comparez à fichier dans Windows share (ils semblent identiques). Sur VM enregistrer le fichier partagé avec nano. Tous les changements sont maintenant reflétés dans le navigateur. Je ne sais pas pourquoi ça marche, mais ça a marché dans mon cas.

mise à jour: après avoir redémarré le serveur VM, le problème est revenu. En suivant les instructions de la Solution, le css s'adapte à nouveau aux mises à jour

0
répondu Mr G 2016-05-17 14:36:42

nous avons un très grand cache nginx (gigaoctets) que nous avons parfois besoin d'effacer. J'ai élaboré un script qui efface instantanément le cache (en ce qui concerne Nginx) et supprime ensuite le répertoire de cache sans affamer l'application principale pour le disque I / O.

en résumé:

  1. déplacez le dossier cache à un nouvel emplacement (sur le même système de fichiers!) (cela ne perturbe aucun descripteur de fichier ouvert)
  2. Recréer le dossier cache original, vide
  3. Recharger Nginx ( gracieux recharger, où nginx permet aux vieux travailleurs de finir demande en cours)
  4. supprimer les vieilles données cachées

voici le script, adapté à Ubuntu 16.04 LTS, avec le cache situé à /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

et au cas où il serait utile, voici la config Nginx que nous utilisons:

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;
    }
}
0
répondu David Eyk 2017-12-07 22:57:57