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?
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é.
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
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.
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
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.
Il y a deux réponses à cette question.
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;
}
J'ai trouvé cela utile
grep -lr 'jquery.js' /path/to/nginx/cache/folder/* | xargs rm
Rechercher, et si trouvé puis supprimer.
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.
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
J'ai aussi eu ce problème.
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!
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".
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.
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é:
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;
}
}
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).
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.
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
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.
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.
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;
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).
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.