309 votes

Comment vider le cache de nginx ?

J'utilise nginx comme serveur frontal, j'ai modifié les fichiers CSS, mais nginx continue de servir les anciens.

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

Certains articles disent que l'on peut simplement supprimer le répertoire de cache : var/cache/nginx mais ce répertoire n'existe pas sur mon serveur.

Que dois-je faire maintenant ?

1 votes

Plus de détails sur votre configuration Nginx serait d'une grande aide. Utilisez-vous proxy_cache ?

0 votes

Non, j'ai juste utilisé la configuration par défaut, et j'ai cherché sur la chaîne de caractères cache Je ne l'ai pas trouvé dans les fichiers de configuration

5 votes

Nginx ne met pas de cache par défaut.

201voto

Deepan Chakravarthy Points 746

J'ai eu exactement le même problème - je faisais tourner mon nginx dans Virtualbox. Je n'avais pas activé la mise en cache. Mais il semble que sendfile a été fixé à on sur nginx.conf et c'est ce qui causait le problème. @kolbyjack l'a mentionné plus haut 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 semble avoir de réels problèmes lorsqu'il est exécuté dans un environnement de machine virtuelle, ou du moins lorsqu'il est exécuté par Virtualbox. Si vous désactivez cette configuration dans nginx, le fichier statique sera servi par une méthode différente et vos modifications seront prises en compte immédiatement et sans problème.

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

7 votes

Reportez-vous à ce qui suit lien

0 votes

Dans mon cas, la solution de rechange consiste à activer gzip pour ces types de fichiers. Dans tous les cas, le problème est résolu.

0 votes

Merci beaucoup à vous et à kolbyjack pour la réponse. Ils m'ont sauvé la vie.

149voto

Jason Wiener Points 136

Vous pouvez également contourner/réduire le cache sur une base fichier par fichier en utilisant

proxy_cache_bypass $http_secret_header;

En prime, vous pouvez renvoyer cet en-tête pour savoir si vous l'avez obtenu à partir du cache (il renvoie "HIT") ou du serveur de contenu (il renvoie "BYPASS").

add_header X-Cache-Status $upstream_cache_status;

pour expirer/rafraîchir le fichier en cache, utilisez curl ou tout autre client de repos pour faire une demande à la page en cache.

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

ceci retournera une copie fraîche de l'élément et remplacera également ce qui est dans le cache.

10 votes

Pourquoi je ne peux voter qu'une seule fois ? Je veux en faire des milliards :)

3 votes

Cela ne peut mettre à jour les pages mises en cache que si la nouvelle page est elle aussi mise en cache. Si vous avez supprimé une page (les erreurs 404 ou autres sont maintenant servies par le backend), la page envoie maintenant un Set-Cookie ou un en-tête "Content-Control : private", le contenu du cache ne sera pas "invalidé".

3 votes

Ce "add_header X-Cache-Status $upstream_cache_status ;" est une fonctionnalité tellement cool !

72voto

Gnarfoz Points 752

À moins que vous n'ayez configuré une zone de cache via chemin d'accès au proxy_cache et l'utiliser ensuite (par exemple dans un bloc de localisation), via : proxy_cache rien ne sera mis en cache.

Si vous l'avez fait, cependant, alors selon l'auteur de nginx Si l'on ne veut pas que les fichiers soient supprimés, il suffit de supprimer tous les fichiers du répertoire de cache.

Le moyen le plus simple : find /path/to/your/cache -type f -delete

0 votes

J'obtiens ceci dans mon journal d'erreurs après avoir supprimé les fichiers : [crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)

0 votes

À plusieurs reprises, ou juste une fois ? Il ne devrait pas s'agir d'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é. Peut-être que le rechargement de nginx (nginx -s reload) pourrait aider si vous obtenez le message de façon répétée. (Je ne suis pas sûr que cela réinitialise également le gestionnaire de cache).

1 votes

Oui, je vide automatiquement le cache de mon site web par un script à chaque fois que je déploie un changement, et le rechargement de nginx ne le répare pas non plus.

25voto

Łukasz Sokolik Points 121

Vous pouvez supprimer le répertoire de 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 que nginx les rafraîchisse.

1 votes

Pour obtenir le résultat exact, vous pouvez ajouter $ au terme de la recherche. Comme grep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*

1 votes

Malheureusement, j'ai obtenu le résultat suivant grep: /var/nginx/cache/*: No such file or directory J'utilise Ubuntu 14.04.3 LTS et nginx/1.8.1. Une idée ?

0 votes

Essayez ce qui suit pour récupérer les fichiers sous /var/nginx/cache : sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;

15voto

deyes Points 264

Il y a deux réponses à cette question.

  • Un pour nginx comme cache inverse
  • Un autre pour nettoyer le cache du navigateur par saisie d'en-tête (celui-ci)

Utilisez :

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

0 votes

J'ai essayé cette mise en œuvre parce que j'ai un problème similaire. Cependant, après avoir effectué le changement, la page Nginx par défaut s'affiche. J'utilise Niginx comme LB avec proxy, dois-je changer la racine peut-être ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X