web-dev-qa-db-fra.com

Comment vider le cache de nginx?

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 cherché sur Google, mais je n'ai pas trouvé de moyen valide pour l'effacer.

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

Qu'est-ce que je devrais faire maintenant?

221
Freewind

J'ai eu exactement le même problème - je courais mon nginx dans Virtualbox. Je n'ai pas activé la mise en cache. Mais on dirait que sendfile était réglé sur on dans nginx.conf et que cela posait problème. @kolbyjack l'a mentionné ci-dessus dans les commentaires.

Quand j'ai éteint sendfile - cela a bien fonctionné.

C'est parce que:

Sendfile est utilisé pour "copier des données entre un descripteur de fichier et un autre" et rencontre 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 immédiatement répercutées.

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

177

Vous pouvez également contourner/remettre en cache fichier par fichier à l’aide de

proxy_cache_bypass $http_secret_header;

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

add_header X-Cache-Status $upstream_cache_status;

pour expirer/actualiser le fichier mis en cache, utilisez curl ou n’importe quel autre client 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 le contenu de la mémoire cache.

95
Jason Wiener

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 le faisiez cependant, alors selon l'auteur de nginx , il suffit de supprimer tous les fichiers du répertoire de cache.

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

57
Gnarfoz

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

20
Łukasz Sokolik

Il y a deux réponses à cette question.

  • Un pour nginx en tant que 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;
}
15
deyes

J'ai trouvé cela utile

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

Rechercher, et si trouvé puis supprimer.

10
agustik

Dans mon installation de 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 nginx et pouvez trouver le répertoire de cache, cela peut également fonctionner pour vous. Soyez très prudent avec la commande rm -rf, si vous êtes dans le mauvais répertoire, vous pouvez supprimer tout votre disque dur.

10
Ganesh Shankar

Je lance un script bash très simple qui prend toutes les 10 secondes pour faire le travail et m'envoie un mail 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
7
MitchellK

J'ai aussi eu ce problème.

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

Mon domaine utilise cloudflare.com pour DNS (excellent service!). Aha! Là c'était:

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

6
Asle

Pour ceux dont les autres solutions ne fonctionnent pas, vérifiez si vous utilisez un service DNS tel que CloudFlare . Dans ce cas, activez le "Mode de développement" ou utilisez l'outil "Purger le cache".

5
Leopoldo Sanczyk

Veuillez prendre note que proxy_cache_bypass peut vous donner un monde de blessures si votre application ne renvoie pas de réponse pouvant être mise en cache pour cette demande spécifique dans laquelle vous la déclenchez.

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

5
dwt

Nous avons un très grand cache nginx (gigaoctets) que nous devons parfois effacer. J'ai élaboré un script qui efface instantanément le cache (en ce qui concerne Nginx), puis supprime le répertoire de cache sans affamer l'application principale pour les E/S de 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 perturbera aucun descripteur de fichier ouvert)
  2. Recréer le dossier de cache d'origine, vide
  3. Recharger Nginx (graceful reload, où nginx permet aux anciens travailleurs 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 vous aiderait, 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;
    }
}
5
David Eyk

Pour ceux qui ont essayé de supprimer les fichiers de cache nginx et que cela n'a pas fonctionné ou a fonctionné de façon intermittente, examinez le paramètre que vous avez défini pour open_file_cache. Si cette option est activée et configurée pour mettre en mémoire cache un descripteur de fichier pendant longtemps, Nginx peut toujours voir une version du fichier en cache, même après l'avoir supprimé du disque. J'ai dû réduire open_file_cache_valid à 1s (je ne suis pas certain qu'il s'agisse essentiellement de la même chose que de désactiver complètement le cache de fichiers).

3
SilentMiles
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
colapsnux

Si vous souhaitez effacer le cache de fichiers spécifiques, vous pouvez utiliser la directive proxy_cache_bypass. Voici comment tu le fais

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

2
Sajjad Ashraf

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

Alors je l'ai enlevé seulement: Sudo rm -rf /data/nginx/cache/

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

1
Brilliant-DucN

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;

    ....
}
...
}

De là-haut, un dossier nommé "nginx_cache" est créé de manière dynamique dans/tmp/pour stocker le contenu mis en cache.

0
austinzmchen

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

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

Ceci supprime tous les fichiers de cache, qui correspondent à la clé "yahoo/*", si nginx.conf était défini:

proxy_cache_key $Host$uri;
0
Ivan BlaBlaBla

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

opcache.enable=1

En le réglant sur 0, le serveur chargeait la dernière version des fichiers (php).

0
Tech Nomad

Je rencontrais une sorte de problème similaire:

Configuration du système et problème: (Sur une machine virtuelle, l’hébergement Web utilise ubuntu et nginx - PHP les actualisations de pages Web ne reflètent 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 détecte pas les modifications apportées au fichier css (l’actualisation n’aide en rien. Changer le nom du fichier css est la seule chose qui a fonctionné)

Solution: Sur VM trouver un fichier partagé (fichier css dans mon cas). Ouvrir avec nano et comparer au fichier dans le partage Windows (ils semblent identiques). Sur VM enregistrer le fichier partagé avec nano. Toutes les modifications sont maintenant reflétées dans le navigateur. Je ne sais pas pourquoi cela fonctionne, mais cela a été le cas dans mon cas.

UPDATE: Après le redémarrage du serveur VM, le problème est revenu. En suivant les instructions de la section Solution, le css a réagi de nouveau aux mises à jour.

0
Mr G