Come cancellare la cache di nginx?


250

Uso nginx come front server, ho modificato i file CSS, ma nginx sta ancora servendo quelli vecchi.

Ho provato a riavviare nginx, senza successo e ho cercato su Google, ma non ho trovato un modo valido per cancellarlo.

Alcuni articoli dicono che possiamo semplicemente eliminare la directory della cache:, var/cache/nginxma sul mio server non esiste tale directory.

Cosa dovrei fare ora?


1
Maggiori dettagli sulla configurazione di Nginx sarebbero di grande aiuto. Stai usando proxy_cache?
Alexander Azarov,

No, ho appena usato la configurazione predefinita e ho cercato la stringa cache, non l'ho trovata nei file di configurazione
Freewind

5
Nginx non memorizza nella cache per impostazione predefinita.
Alexander Azarov,

30
Stai correndo in una virtualbox / vargant vm? In tal caso, prova a disattivare sendfile, poiché non giocano bene insieme.
kolbyjack,

5
sei sicuro che la memorizzazione nella cache sia sul lato nginx, allora? Hai verificato il comportamento con uno strumento come il ricciolo? Spesso, un problema come questo è solo la memorizzazione nella cache lato client che non richiede una risorsa aggiornata perché è stato detto che la vecchia risorsa sarà valida per molto tempo alla scadenza massima; o qualcosa di simile.
kolbyjack,

Risposte:


185

Ho avuto lo stesso identico problema: stavo eseguendo il mio nginx in Virtualbox. Non ho attivato la memorizzazione nella cache. Ma sembra che sendfileè stato impostato onin nginx.confe che è stata la causa del problema. @kolbyjack lo ha menzionato sopra nei commenti.

Quando ho spento sendfile- ha funzionato bene.

Questo è perché:

Sendfile viene utilizzato per "copiare i dati tra un descrittore di file e un altro" e apparentemente presenta alcuni problemi reali quando viene eseguito in un ambiente di macchina virtuale, o almeno quando viene eseguito attraverso Virtualbox. La disattivazione di questa configurazione in nginx provoca la pubblicazione del file statico con un metodo diverso e le modifiche verranno riflesse immediatamente e senza dubbio

È relativo a questo errore: https://www.virtualbox.org/ticket/12597


7
Fare riferimento a questo link
Sian Lerk Lau,

Nel mio caso, la soluzione alternativa è attivare gzip per questi tipi di file. In entrambi i casi il problema è risolto.
Dingle,

Grazie e kolbyjack così tanto per la risposta. Salvato la mia vita.
T1000,

1
Ho usato seguendo 'sudo vim /etc/nginx/nginx.conf' e ho cambiato 'sendfile on' in 'sendfile off'
Koray Güclü

12
Ho disattivato sendfile. Senza fortuna.
marukobotto,

110

Puoi anche bypassare / re-cache su un file per file usando

proxy_cache_bypass $http_secret_header;

e come bonus puoi restituire questo header per vedere se lo hai preso dalla cache (restituirà 'HIT') o dal server di contenuti (restituirà 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

per scadere / aggiornare il file memorizzato nella cache, utilizzare curl o qualsiasi altro client per effettuare una richiesta alla pagina memorizzata nella cache.

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

questo restituirà una nuova copia dell'elemento e sostituirà anche ciò che è nella cache.


7
Perché posso votare solo questa volta? Voglio fare un gazillion :)
Spock,

2
Questo può aggiornare le pagine memorizzate nella cache solo quando anche la nuova pagina è memorizzabile nella cache. Se hai rimosso una pagina (404 o altri errori sono ora offerti dal back-end), la pagina ora invia un'intestazione Set-Cookie o "Content-Control: private", il contenuto memorizzato nella cache non verrà "invalidato".
rbu,

3
Questo "add_header X-Cache-Status $ upstream_cache_status;" è una caratteristica così interessante!
Maxim Masiutin,

1
molte grazie. bel suggerimento per invalidare la cache, ci sono così piccoli tutorial su nginx
Ivan Semochkin,

4
È cambiato da quando hai pubblicato? Posso ottenere con successo una nuova copia con "secret-header" ma non appena rimuovo l'intestazione, ottengo di nuovo la versione cache ...
Pluc

60

A meno che non sia stata configurata una zona cache tramite proxy_cache_path e quindi utilizzata (ad esempio in un blocco di posizione), tramite: proxy_cache nulla verrà memorizzato nella cache.

Se lo hai fatto, tuttavia, secondo l'autore di nginx , è sufficiente rimuovere semplicemente tutti i file dalla directory della cache.

Il modo più semplice: find /path/to/your/cache -type f -delete


Ricevo questo nel mio registro degli errori dopo aver eliminato i file:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson,

Ripetutamente o solo una volta? Non dovrebbe essere un vero problema. Probabilmente significa solo che il gestore della cache ha tentato di eliminare un file che hai già eliminato. Forse ricaricare nginx (nginx -s ricaricare) potrebbe aiutare se ricevi il messaggio ripetutamente. (Non sono sicuro che questo reinizializzi anche il gestore della cache.)
Gnarfoz,

1
sì, svuoto automaticamente la cache del mio sito Web da uno script ogni volta che distribuisco una modifica e ricaricare nginx non lo risolve neanche.
Collin Anderson,

Nop Nginx memorizza nella cache qualcosa anche se non si utilizza roba proxy, ma è un bug con Nginx + VirtualBox.
Thomas Decaux,

1
Sembra piuttosto vago. Potresti approfondire questo? Non sembra che sia correlato all'argomento in questione qui.
Gnarfoz,

20

È possibile eliminare la directory della cache di nginx oppure è possibile cercare file specifici:

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

Ed elimina solo un file per aggiornarlo con nginx.


1
Per ottenere il risultato esatto, puoi aggiungere $ al termine di ricerca. Comegrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang,

1
Sfortunatamente ho ottenuto il seguente output grep: /var/nginx/cache/*: No such file or directorysto usando Ubuntu 14.04.3 LTS e nginx / 1.8.1. Qualche idea?
b00r00x0,

Prova i seguenti file grep in / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau

Credo che sia / var / cache / nginx / * (dir cache prima di nginx nel percorso)
Randy Lam

15

Ci sono due risposte in questa domanda.

  • Uno per nginx come cache inversa
  • Un altro per pulire la cache del browser tramite input di intestazione (questo)

Uso:

expires modified +90d;

PER ESEMPIO:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}

Ho provato questa implementazione perché sto riscontrando un problema simile. Tuttavia, dopo aver apportato la modifica, mostra la pagina Nginx predefinita. Sto usando Niginx come LB con proxy, forse devo cambiare root?
Aaron,

10

L'ho trovato utile

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

Cerca e, se trovato, quindi elimina.


9

Nella mia installazione di nginx ho scoperto che dovevo andare a:

/opt/nginx/cache

e

sudo rm -rf *

in quella directory. Se conosci il percorso dell'installazione di nginx e riesci a trovare la directory della cache, lo stesso potrebbe funzionare per te. Fai molta attenzione con il rm -rfcomando, se ti trovi nella directory sbagliata potresti eliminare l'intero disco rigido.


2
dopo è necessario riavviare NGINX
Eliel Haouzi,

E questa è la parte cattiva
kidz,

9

Eseguo uno script bash molto semplice che impiega tutti i 10 secondi per fare il lavoro e mi manda una mail quando finito.

#!/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

8

Ho avuto anche questo problema.

  • Impossibile trovare alcuna cartella nginx / cache
  • sendfile era spento

Il mio dominio utilizza cloudflare.com per DNS (ottimo servizio!). Aha! Eccolo lì:

cloudflare.com -> memorizzazione nella cache -> Purge Cache (ho eliminato tutto) Ciò ha risolto il mio problema!


2
Questo cancella le cache dei bordi di Cloudflare. Non cancella la cache Nginx sul tuo server.
mahemoff,

Come consiglio, penso che sia una risposta valida.
Fernando Kosh,

Questa è stata una risposta eccellente. Stavo scavando ore perché alcuni file sono ancora in cache e non riuscivo a indovinare che era colpa di CloudFlare. Grazie!
undefinedman

6

Abbiamo una cache nginx (gigabyte) molto grande che occasionalmente dobbiamo cancellare. Ho elaborato uno script che cancella immediatamente la cache (per quanto riguarda Nginx) e quindi rimuove la directory della cache senza morire di fame l'applicazione principale per l'I / O del disco.

In sintesi:

  1. Sposta la cartella cache in una nuova posizione (sullo stesso filesystem!) (Questo non disturba nessun descrittore di file aperto)
  2. Ricrea la cartella cache originale, vuota
  3. Ricarica Nginx ( caricamento grazioso , in cui nginx consente ai vecchi lavoratori di completare le richieste in corso)
  4. Rimuovi i vecchi dati memorizzati nella cache

Ecco lo script, su misura per Ubuntu 16.04 LTS, con la cache situata in /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

E nel caso sia utile, ecco la configurazione di Nginx che usiamo:

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

Per coloro che altre soluzioni non funzionano, controlla se stai utilizzando un servizio DNS come CloudFlare . In tal caso, attivare la "Modalità di sviluppo" o utilizzare lo strumento "Svuota cache".


5

Tieni presente che proxy_cache_bypass può farti male se la tua app non restituisce una risposta memorizzabile nella cache per quella specifica richiesta in cui la attivi.

Se ad esempio la tua app invia un cookie ad ogni prima richiesta, uno script che attiva proxy_pass_bypass tramite curl probabilmente riceverà quel cookie nella risposta e nginx non utilizzerà quella risposta per aggiornare l'elemento memorizzato nella cache.


3
find /etc/nginx/cache_folder -type d -exec rm -rvf {} \;
mkdir /etc/nginx/cache_folder
service nginx restart

Fare attenzione a specificare correttamente il percorso corretto.


3

Per coloro che hanno provato a cancellare i file della cache di nginx e che non ha funzionato o ha funzionato in modo intermittente, dai un'occhiata alle tue impostazioni per open_file_cache. Se questo è abilitato e configurato per memorizzare nella cache un descrittore di file per un lungo periodo, Nginx potrebbe comunque visualizzare una versione del file memorizzato nella cache, anche dopo averlo eliminato dal disco. Ho dovuto ridurre open_file_cache_valid a 1s (non sono sicuro se questo è essenzialmente lo stesso di disabilitare completamente la cache dei file).


2

Sul mio server, la cartella cache nginx è su /data/nginx/cache/

Quindi l'ho rimosso solo: sudo rm -rf /data/nginx/cache/

Spero che questo possa aiutare chiunque.


2

Se si desidera cancellare la cache di file specifici, è possibile utilizzare la proxy_cache_bypassdirettiva. Questo è come lo fai

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

Ora se vuoi bypassare la cache accedi al file passando il parametro nocache

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


1
Immagino che questo possa essere usato per attaccare e consumare larghezza di banda nel tuo sito web.
Marcelo Agimóvel,

1
Questo non ignora semplicemente la cache per la richiesta corrente ( app.css?nocache=true) mentre il file originale (senza query) rimane nella cache ( app.css)?
adrianTNT,

1

È possibile aggiungere la configurazione in nginx.conf come il seguente.

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

    ....
}
...
}

Dall'alto, una cartella denominata "nginx_cache" viene creata in modo dinamico in / tmp / per archiviare il contenuto memorizzato nella cache.


1

Esiste un metodo giusto per rimuovere solo i file di cache, che corrisponde a qualsiasi KEY. Per esempio:

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

Ciò rimuove tutti i file di cache, che corrispondono a KEY "yahoo / *", se è stato impostato in nginx.conf:

proxy_cache_key $host$uri;

1

Usiamo nginx per la memorizzazione nella cache di molte cose. Esistono decine di migliaia di elementi nella directory della cache. Per trovare elementi ed eliminarli, abbiamo sviluppato alcuni script per semplificare questo processo. Di seguito è possibile trovare il repository per questi script:

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

L'idea è semplice Per creare un indice della cache (con chiavi cache e file cache corrispondenti) e cercare all'interno di questo file indice. Ci ha davvero aiutato ad accelerare la ricerca di elementi (da minuti a sotto-secondi) ed eliminarli di conseguenza.


1

Nel mio caso, touchquel file Css, fa sembrare che le risorse siano cambiate (in realtà touchnon fa nulla al file, tranne la modifica dell'ora dell'ultima modifica), quindi browser e nginx applicheranno le ultime risorse


0

Stavo riscontrando una sorta di problema simile:

Installazione del sistema e problema: (In una virtualbox sto utilizzando l'hosting Web Ubuntu e nginx - Gli aggiornamenti della pagina Web PHP non riflettono le modifiche al file CSS esterno). Sto sviluppando un sito Web su Windows Machine e trasferendo i file su nginx tramite una cartella condivisa. Sembra che nginx non rilevi le modifiche al file css (l'aggiornamento in alcun modo non aiuta. La modifica del nome del file css è l'unica cosa che ha funzionato)

Soluzione: su VM, trova il file condiviso (file css nel mio caso). Apri con nano e confronta con il file nella condivisione di Windows (sembrano identici). Sulla VM salva il file condiviso con nano. Tutte le modifiche si riflettono ora nel browser. Non sono sicuro del perché funzioni, ma nel mio caso è stato.

AGGIORNAMENTO: dopo il riavvio del server VM il problema è tornato. Seguire le istruzioni in Soluzione ha reso il CSS nuovamente rispondente agli aggiornamenti


-1

Nel mio caso era l'opcache abilitato in /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Impostandolo su 0, il server ha caricato l'ultima versione dei file (php).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.