¿Cómo borrar el caché de nginx?

250

Utilizo nginx como servidor frontal, modifiqué los archivos CSS, pero nginx sigue sirviendo a los antiguos.

Traté de reiniciar nginx, sin éxito y busqué en Google, pero no encontré una forma válida de borrarlo.

Algunos artículos dicen que simplemente podemos eliminar el directorio de caché: var/cache/nginxpero no existe tal directorio en mi servidor.

¿Qué debería hacer ahora?

Viento libre
fuente
1
Más detalles sobre su configuración de Nginx serían de mucha ayuda. Estas usando proxy_cache?
Alexander Azarov
No, acabo de usar la configuración predeterminada y busqué sobre la cadena cache, no la encontré en los archivos de configuración
Freewind
55
Nginx no almacena en caché por defecto.
Alexander Azarov
30
¿Estás ejecutando en un virtualbox / vargant vm? Si es así, intente desactivar sendfile, ya que no juegan bien juntos.
kolbyjack
55
¿estás seguro de que el almacenamiento en caché está en el lado nginx, entonces? ¿Has verificado el comportamiento con una herramienta como curl? Muchas veces, un problema como este es simplemente el almacenamiento en caché del lado del cliente que no solicita un recurso actualizado porque se ha dicho que el recurso anterior será válido durante mucho tiempo cuando expire max; o algo similar.
kolbyjack 05 de

Respuestas:

185

Tuve exactamente el mismo problema: estaba ejecutando mi nginx en Virtualbox. No tenía el almacenamiento en caché activado. Pero parece que sendfilese establece en onen nginx.confy que estaba causando el problema. @kolbyjack lo mencionó anteriormente en los comentarios.

Cuando apagué sendfile, funcionó bien.

Esto es porque:

Sendfile se usa para 'copiar datos entre un descriptor de archivo y otro' y aparentemente tiene algunos problemas reales cuando se ejecuta en un entorno de máquina virtual, o al menos cuando se ejecuta a través de Virtualbox. Desactivar esta configuración en nginx hace que el archivo estático se sirva a través de un método diferente y sus cambios se reflejarán de inmediato y sin dudas

Está relacionado con este error: https://www.virtualbox.org/ticket/12597

Deepan Chakravarthy
fuente
77
Consulte este enlace
Sian Lerk Lau
En mi caso, la solución alternativa es activar gzip para estos tipos de archivos. De cualquier manera, el problema está resuelto.
Dingle
Gracias y kolbyjack por la respuesta. Salvó mi vida.
T1000
1
Solía ​​seguir 'sudo vim /etc/nginx/nginx.conf' y cambiar 'sendfile on' a 'sendfile off'
Koray Güclü
12
Apagué el archivo de envío. Sin suerte.
marukobotto
110

También puede omitir / volver a almacenar en caché archivo por archivo utilizando

proxy_cache_bypass $http_secret_header;

y como bonificación, puede devolver este encabezado para ver si lo obtuvo del caché (devolverá 'HIT') o del servidor de contenido (devolverá 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

para caducar / actualizar el archivo en caché, use curl o cualquier otro cliente de descanso para realizar una solicitud a la página en caché.

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

Esto devolverá una copia nueva del elemento y también reemplazará lo que está en caché.

Jason Wiener
fuente
77
¿Por qué solo puedo votar esta vez? Quiero hacer un gazillion :)
Spock
2
Esto solo puede actualizar las páginas en caché cuando la nueva página también se puede almacenar en caché. Si ha eliminado una página (ahora el backend sirve 404 u otros errores), la página ahora envía un Set-Cookie o un encabezado "Content-Control: private", el contenido en caché no será "invalidado".
rbu
3
Este "add_header X-Cache-Status $ upstream_cache_status;" Es una característica tan genial!
Maxim Masiutin
1
muchas gracias. buen consejo para la invalidación de caché, hay tan pocos tutoriales sobre nginx
Ivan Semochkin 05 de
44
¿Ha cambiado esto desde que publicaste? Puedo obtener una copia nueva con éxito con el "encabezado secreto" pero tan pronto como
elimino
60

A menos que haya configurado una zona de caché a través de proxy_cache_path y luego la haya usado (por ejemplo, en un bloque de ubicación), a través de: proxy_cache, nada se almacenará en caché.

Sin embargo, si lo hizo, según el autor de nginx , basta con eliminar todos los archivos del directorio de caché.

La forma más simple: find /path/to/your/cache -type f -delete

Gnarfoz
fuente
Recibo esto en mi registro de errores después de eliminar los archivos:[crit] 1640#0: unlink() "/path/to/cache/85/1cc5328db278b328f2c200c65179ad85" failed (2: No such file or directory)
Collin Anderson
Repetidamente, o solo una vez? No debería ser un problema real. Probablemente solo signifique que el administrador de caché intentó eliminar un archivo que ya eliminó. Tal vez recargar nginx (nginx -s reload) podría ayudar si recibe el mensaje repetidamente. (No estoy seguro si eso también reinicia el administrador de caché).
Gnarfoz
1
Sí, borro automáticamente el caché de mi sitio web mediante un script cada vez que implemento un cambio, y la recarga de nginx tampoco lo soluciona.
Collin Anderson
Nop Nginx almacena en caché algo, incluso si no usa material proxy, pero es un error con Nginx + VirtualBox.
Thomas Decaux el
1
Eso suena bastante vago. ¿Podrías dar más detalles sobre eso? No parece que esté relacionado con el tema en cuestión aquí.
Gnarfoz
20

Puede eliminar el directorio de caché de nginx o puede buscar un archivo específico:

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

Y elimine solo un archivo para nginx actualizarlos.

Łukasz Sokolik
fuente
1
Para obtener el resultado exacto, puede agregar $ al término de búsqueda. Me gustagrep -lr 'http://mydomain.pl/css/myedited.css$' /var/nginx/cache/*
Jifeng Zhang
1
Desafortunadamente, obtuve el siguiente resultado grep: /var/nginx/cache/*: No such file or directory: estoy usando Ubuntu 14.04.3 LTS y nginx / 1.8.1. ¿Alguna idea?
b00r00x0
Pruebe lo siguiente para grep archivos en / var / nginx / cache:sudo find /var/nginx/cache -type f -exec grep -l '/css/myedited.css' {} \;
jaybrau
Creo que es / var / cache / nginx / * (dir cache antes de nginx en la ruta)
Randy Lam
15

Hay dos respuestas en esta pregunta.

  • Uno para nginx como caché inverso
  • Otro para limpiar el caché del navegador por entrada de encabezado (este)

Utilizar:

expires modified +90d;

P.EJ:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
deyes
fuente
Intenté esta implementación porque tengo un problema similar. Sin embargo, después de realizar el cambio, muestra la página predeterminada de Nginx. Estoy usando Niginx como LB con proxy, ¿debo cambiar la raíz?
Aaron
10

Esto me pareció útil

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

Buscar y, si se encuentra, eliminar.

agustik
fuente
9

En mi instalación de nginx descubrí que tenía que ir a:

/opt/nginx/cache

y

sudo rm -rf *

en ese directorio Si conoce la ruta a su instalación de nginx y puede encontrar el directorio de caché, el mismo puede funcionar para usted. Tenga mucho cuidado con el rm -rfcomando, si está en el directorio incorrecto, podría eliminar todo el disco duro.

Ganesh Shankar
fuente
2
necesitas reiniciar NGINX después de eso
Eliel Haouzi
Y esa es la parte mala
kidz
9

Ejecuto un script bash muy simple que toma 10 segundos para hacer el trabajo y me envía un correo cuando termine.

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

Tuve este problema también.

  • No se pudo encontrar ninguna carpeta nginx / cache
  • sendfile estaba apagado

Mi dominio usa cloudflare.com para DNS (¡gran servicio!). ¡Ajá! Allí estaba:

cloudflare.com -> almacenamiento en caché -> Purgar caché (purgué todo) ¡Eso resolvió mi problema!

Asle
fuente
2
Esto purga los cachés de borde de Cloudflare. No borra el caché Nginx en su propio servidor.
mahemoff
Como consejo, creo que es una respuesta válida.
Fernando Kosh
Esta fue una excelente respuesta. Estaba cavando horas por qué algunos archivos todavía se están almacenando en caché y no podía adivinar que era 'falla' de CloudFlare. ¡Gracias!
undefinedman
6

Tenemos un caché nginx muy grande (gigabytes) que ocasionalmente necesitamos borrar. He elaborado un script que borra instantáneamente el caché (en lo que respecta a Nginx) y luego elimina el directorio de caché sin privar a la aplicación principal de E / S de disco.

En resumen:

  1. Mueva la carpeta de caché a una nueva ubicación (en el mismo sistema de archivos) (esto no interrumpe ningún descriptor de archivo abierto)
  2. Recree la carpeta de caché original, vacía
  3. Recargar Nginx ( recarga elegante , donde nginx permite a los trabajadores antiguos finalizar las solicitudes en curso)
  4. Eliminar datos antiguos en caché

Aquí está el script, adaptado a Ubuntu 16.04 LTS, con el caché ubicado en /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

Y en caso de que sea útil, aquí está la configuración de Nginx que usamos:

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
fuente
5

Para aquellos que otras soluciones no funcionan, verifique si está utilizando un servicio DNS como CloudFlare . En ese caso, active el "Modo de desarrollo" o use la herramienta "Purgar caché".

Leopoldo Sanczyk
fuente
5

Tenga en cuenta que proxy_cache_bypass puede causarle mucho daño si su aplicación no devuelve una respuesta almacenable en caché para esa solicitud específica donde la activa.

Si, por ejemplo, su aplicación envía una cookie con cada primera solicitud, entonces un script que activa proxy_pass_bypass a través de curl probablemente obtendrá esa cookie en la respuesta, y nginx no usará esa respuesta para actualizar el elemento almacenado en caché.

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

Tenga cuidado de especificar correctamente la ruta correcta.

colapsnux
fuente
3

Para aquellos que han intentado eliminar los archivos de caché nginx, y que no ha funcionado o ha funcionado de forma intermitente, eche un vistazo a su configuración para open_file_cache. Si esto está habilitado y configurado para almacenar en caché un descriptor de archivo durante mucho tiempo, entonces Nginx aún puede ver una versión del archivo en caché, incluso después de haberlo eliminado del disco. Tuve que reducir open_file_cache_valid a 1s (no estoy seguro de si esto es esencialmente lo mismo que deshabilitar la caché del archivo por completo).

SilentMiles
fuente
2

En mi servidor, la carpeta de caché nginx está en /data/nginx/cache/

Entonces lo eliminé solo: sudo rm -rf /data/nginx/cache/

Espero que esto ayude a cualquiera.

Brillante-DucN
fuente
2

Si desea borrar el caché de archivos específicos, puede usar la proxy_cache_bypassdirectiva. Así es como lo haces

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

Ahora, si desea omitir el caché, acceda al archivo pasando el parámetro nocache

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

Sajjad Ashraf
fuente
1
Supongo que esto podría usarse para atacar y consumir ancho de banda en su sitio web.
Marcelo Agimóvel
1
¿Esto simplemente no pasa por alto el caché para la solicitud actual ( app.css?nocache=true) mientras el archivo original (sin consulta) permanece en el caché ( app.css)?
adrianTNT
1

Puede agregar configuración en nginx.conf de la siguiente manera.

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

    ....
}
...
}

Desde arriba, una carpeta llamada "nginx_cache" se crea dinámicamente en / tmp / para almacenar contenido en caché.

austinzmchen
fuente
1

Hay un método correcto para eliminar solo los archivos de caché, que coincide con cualquier CLAVE. Por ejemplo:

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

Esto elimina todos los archivos de caché, que coinciden con la CLAVE "yahoo / *", si en nginx.conf se configuró:

proxy_cache_key $host$uri;
Ivan BlaBlaBla
fuente
1

Usamos nginx para almacenar en caché muchas cosas. Hay decenas de miles de elementos en el directorio de caché. Para encontrar elementos y eliminarlos, hemos desarrollado algunos scripts para simplificar este proceso. Puede encontrar el repositorio de estos scripts a continuación:

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

La idea es simple. Para crear un índice de la caché (con claves de caché y los archivos de caché correspondientes) y buscar dentro de este archivo de índice. Realmente nos ayudó a acelerar la búsqueda de elementos (de minutos a segundos) y eliminarlos en consecuencia.

Zafer
fuente
1

En mi caso, touchese archivo Css hace que parezca que los recursos han cambiado (en realidad touchno hace nada al archivo, excepto cambiar el tiempo de última modificación), por lo que el navegador y nginx aplicarán los últimos recursos

Noé
fuente
0

Estaba experimentando un tipo de problema similar:

Configuración del sistema y problema: (en una caja virtual estoy alojando web usando ubuntu y nginx - las actualizaciones de la página web PHP no reflejaron cambios en el archivo css externo) Estoy desarrollando un sitio web en una máquina con Windows y transfiriendo archivos a nginx a través de una carpeta compartida. Parece que nginx no recoge los cambios en el archivo css (actualizar de cualquier manera no ayuda. Cambiar el nombre del archivo css es lo único que funcionó)

Solución: en VM encuentre el archivo compartido (archivo css en mi caso). Abra con nano y compare con el archivo en Windows Share (parecen idénticos). En VM guardar archivo compartido con nano. Todos los cambios ahora se reflejan en el navegador. No estoy seguro de por qué esto funciona, pero lo hizo en mi caso.

ACTUALIZACIÓN: Después de reiniciar el servidor VM, el problema volvió. Seguir las instrucciones de la Solución hizo que el CSS respondiera a las actualizaciones nuevamente

Señor g
fuente
-1

En mi caso, fue el opcache habilitado en /etc/php/7.2/fpm/php.ini (Ubuntu):

opcache.enable=1

Establecerlo en 0 hizo que el servidor cargara la última versión de los archivos (php).

Nómada de la tecnología
fuente