Comment vider le cache de nginx?

250

J'utilise nginx comme serveur frontal, j'ai modifié les fichiers CSS, mais nginx sert toujours les anciens.

J'ai essayé de redémarrer nginx, sans succès et j'ai googlé, mais je n'ai pas trouvé de moyen valide de le supprimer.

Certains articles disent que nous pouvons simplement supprimer le répertoire de cache:, var/cache/nginxmais il n'y a pas de tel répertoire sur mon serveur.

Qu'est-ce que je devrais faire maintenant?

Freewind
la source
1
Plus de détails sur votre configuration Nginx seraient d'une grande aide. Utilisez-vous proxy_cache?
Alexander Azarov
Non, je viens d'utiliser la configuration par défaut, et j'ai cherché une chaîne cache, je ne l'ai pas trouvée dans les fichiers de configuration
Freewind
5
Nginx ne met pas en cache par défaut.
Alexander Azarov
30
Utilisez-vous une virtualbox / vargant vm? Si c'est le cas, essayez de désactiver sendfile, car ils ne fonctionnent pas bien ensemble.
kolbyjack
5
êtes-vous sûr que la mise en cache est du côté nginx, alors? Avez-vous vérifié le comportement avec un outil comme curl? Souvent, un problème comme celui-ci est simplement la mise en cache côté client qui ne demande pas de ressource mise à jour car on lui a dit que l'ancienne ressource sera valide pendant longtemps en expirant max; ou quelque chose de similaire.
kolbyjack

Réponses:

185

J'ai eu exactement le même problème - j'exécutais mon nginx dans Virtualbox. Je n'ai pas activé la mise en cache. Mais ressemble sendfilea été mis à onen nginx.confet qui a été l' origine du problème. @kolbyjack l'a mentionné ci-dessus dans les commentaires.

Quand je me suis éteint sendfile- cela a bien fonctionné.

Ceci est dû au fait:

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é via Virtualbox. Si vous désactivez cette configuration dans nginx, le fichier statique sera servi via une méthode différente et vos modifications seront reflétées immédiatement et sans aucun doute

Il est lié à ce bug: https://www.virtualbox.org/ticket/12597

Deepan Chakravarthy
la source
7
Se référer à ce lien
Sian Lerk Lau
Dans mon cas, la solution alternative consiste à activer gzip pour ces types de fichiers. Quoi qu'il en soit, le problème est résolu.
Dingle
Merci beaucoup et kolbyjack pour la réponse. Sauvé ma vie.
T1000
1
J'ai utilisé le suivant 'sudo vim /etc/nginx/nginx.conf' et j'ai changé 'sendfile on' en 'sendfile off'
Koray Güclü
12
J'ai désactivé sendfile. Pas de chance.
marukobotto
110

Vous pouvez également contourner / remettre en cache fichier par fichier en utilisant

proxy_cache_bypass $http_secret_header;

et en bonus, vous pouvez retourner cet en-tête pour voir si vous l'avez obtenu du cache (renverra 'HIT') ou du serveur de contenu (renverra 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

pour expirer / actualiser le fichier mis en cache, utilisez curl ou tout autre client de repos pour faire une demande à la page mise en cache.

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

cela renverra une nouvelle copie de l'élément et remplacera également ce qui est dans le cache.

Jason Wiener
la source
7
Pourquoi ne puis-je voter que cette fois? Je veux faire un gazillion :)
Spock
2
Cela ne peut mettre à jour les pages mises en cache que lorsque la nouvelle page peut également être mise en cache. Si vous avez supprimé une page (404 ou d'autres erreurs sont maintenant servies par le backend), la page envoie maintenant un Set-Cookie ou un en-tête "Content-Control: private", le contenu mis en cache ne sera pas "invalidé".
rbu
3
Ce "add_header X-Cache-Status $ upstream_cache_status;" est une fonctionnalité tellement cool!
Maxim Masiutin le
1
Merci beaucoup. belle astuce pour l'invalidation du cache, il y a si peu de tutoriels sur nginx
Ivan Semochkin
4
Cela a-t-il changé depuis votre publication? Je peux réussir à obtenir une nouvelle copie avec le "secret-header" mais dès que je retire l'en-tête, j'obtiens à nouveau la version en cache ...
Pluc
60

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

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

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

Gnarfoz
la source
je reçois ceci dans mon journal des erreurs après avoir supprimé les fichiers:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson
À plusieurs reprises ou une seule fois? Ce ne devrait pas être un problème réel. Cela signifie probablement que le gestionnaire de cache a essayé de supprimer un fichier que vous avez déjà supprimé. Le rechargement de nginx (nginx -s reload) peut être utile si vous recevez le message à plusieurs reprises. (Je ne sais pas si cela réinitialise également le gestionnaire de cache.)
Gnarfoz
1
oui, j'efface automatiquement le cache de mon site Web par un script chaque fois que je déploie une modification, et le rechargement de nginx ne le corrige pas non plus.
Collin Anderson
Nop Nginx met en cache quelque chose même si vous n'utilisez pas de proxy, mais c'est un bogue avec Nginx + VirtualBox.
Thomas Decaux
1
Cela semble plutôt vague. Pouvez-vous développer sur ce sujet? Il ne semble pas que cela soit lié au sujet traité ici.
Gnarfoz
20

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 supprimez un seul fichier pour les actualiser nginx.

Łukasz Sokolik
la source
1
Pour obtenir le résultat exact, vous pouvez ajouter $ au terme de recherche. Commegrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang
1
Malheureusement, j'ai obtenu la sortie suivante, grep: /var/nginx/cache/*: No such file or directoryj'utilise Ubuntu 14.04.3 LTS et nginx / 1.8.1. Une idée?
b00r00x0
Essayez ce qui suit pour grep les fichiers sous / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau
Je crois que c'est / var / cache / nginx / * (dir cache avant nginx dans le chemin)
Randy Lam
15

Il y a deux réponses à cette question.

  • Un pour nginx comme cache inversé
  • Un autre pour nettoyer le cache du navigateur par entrée d'en-tête (celui-ci)

Utilisation:

expires modified +90d;

PAR EXEMPLE:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
deyes
la source
J'ai essayé cette implémentation car j'ai un problème similaire. Cependant, après avoir fait le changement - il montre la page Nginx par défaut. J'utilise Niginx comme LB avec proxy, dois-je changer de racine peut-être?
Aaron
10

J'ai trouvé cela utile

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

Recherchez, et si trouvé, supprimez.

agustik
la source
9

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 de votre installation de nginx et que vous pouvez trouver le répertoire de cache, le même peut fonctionner pour vous. Soyez très prudent avec la rm -rfcommande, si vous êtes dans le mauvais répertoire, vous pouvez supprimer l'intégralité de votre disque dur.

Ganesh Shankar
la source
2
vous devez redémarrer NGINX après cela
Eliel Haouzi
Et c'est la mauvaise partie
kidz
9

J'exécute un script bash très simple qui prend toutes les 10 secondes pour faire le travail et m'envoie un courrier une fois terminé.

#!/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
la source
8

J'ai aussi eu ce problème.

  • Impossible de trouver un dossier nginx / cache
  • sendfile était désactivé

Mon domaine utilise cloudflare.com pour DNS (excellent service!). Ah! C'était là:

cloudflare.com -> mise en cache -> Purger le cache (j'ai tout purgé) Cela a résolu mon problème!

Asle
la source
2
Cela purge les caches de bord de Cloudflare. Il n'efface pas le cache Nginx sur votre propre serveur.
mahemoff
À titre de conseil, je pense que c'est une réponse valable.
Fernando Kosh
C'était une excellente réponse. Je creusais des heures pourquoi certains fichiers sont toujours mis en cache et je ne pouvais pas deviner que c'était la «faute» de CloudFlare. Merci!
undefinedman
6

Nous avons un très grand cache nginx (gigaoctets) que nous devons parfois nettoyer. J'ai élaboré un script qui efface instantanément le cache (en ce qui concerne Nginx), puis supprime le répertoire du cache sans affamer l'application principale pour les E / S disque.

En résumé:

  1. Déplacez le dossier de cache vers un nouvel emplacement (sur le même système de fichiers!) (Cela ne perturbe aucun descripteur de fichier ouvert)
  2. Recréez le dossier de cache d'origine, vide
  3. Recharger Nginx ( rechargement gracieux , où nginx permet aux anciens employés de terminer les demandes en cours)
  4. Supprimer les anciennes données mises en cache

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ù cela serait utile, voici la configuration 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;
    }
}
David Eyk
la source
5

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 "Purger le cache".

Leopoldo Sanczyk
la source
5

Veuillez noter que proxy_cache_bypass peut vous faire mal si votre application ne renvoie pas de réponse pouvant être mise en cache pour cette demande spécifique où vous la déclenchez.

Si, par exemple, votre application envoie un cookie à chaque première demande, un script qui déclenche proxy_pass_bypass via curl obtiendra probablement ce cookie dans la réponse, et nginx n'utilisera pas cette réponse pour actualiser l'élément mis en cache.

dwt
la source
3
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.

colapsnux
la source
3

Pour ceux qui ont essayé de supprimer les fichiers de cache nginx, et que cela n'a pas fonctionné ou a fonctionné par intermittence, consultez 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, Nginx peut toujours voir une version du fichier mis en cache, même après l'avoir supprimé du disque. J'ai dû réduire open_file_cache_valid à 1 s (je ne suis pas certain si cela revient essentiellement à désactiver complètement le cache de fichiers).

SilentMiles
la source
2

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

Je l'ai donc supprimé uniquement: sudo rm -rf /data/nginx/cache/

J'espère que cela aidera n'importe qui.

Brilliant-DucN
la source
2

Si vous souhaitez vider le cache de fichiers spécifiques, vous pouvez utiliser la proxy_cache_bypassdirective. Voici comment vous le faites

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

Maintenant, si vous voulez contourner le cache, vous accédez au fichier en passant le paramètre nocache

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

Sajjad Ashraf
la source
1
Je suppose que cela pourrait être utilisé pour attaquer et consommer la bande passante de votre site Web.
Marcelo Agimóvel
1
Cela ne contourne-t-il pas simplement le cache pour la requête actuelle ( app.css?nocache=true) tandis que le fichier d'origine (sans requête) reste dans le cache ( app.css)?
adrianTNT
1

Vous pouvez ajouter une 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 créé dynamiquement dans / tmp / pour stocker le contenu mis en cache.

austinzmchen
la source
1

Il existe une bonne méthode pour supprimer uniquement les fichiers cache, qui correspond à n'importe quelle clé. Par exemple:

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

Cela supprime tous les fichiers cache, ce qui correspond à KEY "yahoo / *", si dans nginx.conf a été défini:

proxy_cache_key $host$uri;
Ivan BlaBlaBla
la source
1

Nous utilisons nginx pour mettre en cache beaucoup de choses. Le répertoire de cache contient des dizaines de milliers d'éléments. Pour trouver des éléments et les supprimer, nous avons développé quelques scripts pour simplifier ce processus. Vous pouvez trouver le référentiel de ces scripts ci-dessous:

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

L'idée est simple. Pour créer un index du cache (avec les clés de cache et les fichiers de cache correspondants) et effectuer une recherche dans ce fichier d'index. Cela nous a vraiment aidés à accélérer la recherche d'éléments (de quelques minutes à une sous-seconde) et à les supprimer en conséquence.

Zafer
la source
1

Dans mon cas, touchce fichier Css, donne l'impression que les ressources ont changé (en fait, touchne fait rien au fichier, sauf changer la dernière heure de modification), donc le navigateur et nginx appliqueront les dernières ressources

Noé
la source
0

Je rencontrais une sorte de problème similaire:

Configuration du système et problème: (Sur une boîte virtuelle, j'héberge sur le Web en utilisant ubuntu et nginx - les mises à jour de la page Web PHP ne reflétaient pas les modifications apportées au fichier CSS externe). Je développe un site Web sur une machine Windows et transfère des fichiers vers nginx via un dossier partagé. Il semble que nginx ne récupère pas les modifications apportées au fichier css (l'actualisation de toute façon n'aide pas. Changer le nom du fichier css est la seule chose qui a fonctionné)

Solution: Sur VM, trouvez un fichier partagé (fichier css dans mon cas). Ouvrez avec nano et comparez au fichier dans le partage Windows (ils semblent identiques). Sur VM, enregistrez le fichier partagé avec nano. Toutes les modifications sont désormais reflétées dans le navigateur. Je ne sais pas pourquoi cela fonctionne, mais c'est le cas dans mon cas.

MISE À JOUR: Après le redémarrage du serveur VM, le problème est revenu. En suivant les instructions sous Solution, le CSS a de nouveau répondu aux mises à jour

Mr G
la source
-1

Dans mon cas, c'était l'opcache activé dans /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Le mettre à 0 a obligé le serveur à charger la dernière version des fichiers (php).

Tech Nomad
la source