Cómo limpiar la caché de nginx?


Utilizo nginx to como servidor principal, he modificado los archivos CSS, pero nginx sigue sirviendo a los antiguos.

He intentado reiniciar nginx, sin éxito y he buscado en Google, pero no he encontrado una forma válida de borrarlo.

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

¿Qué debo hacer ahora?

 194
Author: Teun Zengerink, 2011-06-04

18 answers

Tuve exactamente el mismo problema - estaba ejecutando mi nginx en Virtualbox. No tenía el almacenamiento en caché activado. Pero parece que sendfile se estableció en on en nginx.conf y eso estaba causando el problema. @kolbyjack lo mencionó anteriormente en los comentarios.

Cuando apagué sendfile - funcionó bien.

Esto es porque:

Sendfile se utiliza para 'copiar datos entre un descriptor de archivo y otro' y aparentemente tiene algunos problemas reales cuando se ejecuta en una máquina virtual entorno, 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 inmediatamente y sin duda

 166
Author: Deepan Chakravarthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 13:33:53

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

proxy_cache_bypass $http_secret_header;

Y como bono puedes devolver este encabezado para ver si lo obtuviste de la caché (devolverá 'HIT') o del servidor de contenido (devolverá 'BYPASS').

add_header X-Cache-Status $upstream_cache_status;

Para caducar/actualizar el archivo almacenado en caché, utilice curl o cualquier cliente rest para hacer una solicitud a la página almacenada 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é.

 78
Author: Jason Wiener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 04:58:27

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

Si lo hizo, sin embargo, entonces según el autor de nginx, simplemente eliminar todos los archivos del directorio de caché es suficiente.

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

 52
Author: Gnarfoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-01 10:07:57

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 que nginx los actualice.

 18
Author: Łukasz Sokolik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 08:20:45

Hay dos respuestas en esta pregunta.

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

Uso:

expires modified +90d;

Ej:

location ~* ^.+\.(css|js|jpg|gif|png|txt|ico|swf|xml)$ {
    access_log off;
    root /path/to/htdocs;
    expires modified +90d;
}
 13
Author: deyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-13 18:52:54

En mi instalación de nginx encontré 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é, lo mismo puede funcionar para usted. Sea muy cuidadoso con el comando rm -rf, si se encuentra en el directorio equivocado, podría eliminar todo el disco duro.

 10
Author: Ganesh Shankar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-16 14:57:06

Encontré esto útil

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

Buscar, y si se encuentra a continuación, eliminar.

 10
Author: agustik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-19 22:35:26

Para aquellos que otras soluciones no están funcionando, compruebe si está utilizando un servicio DNS como CloudFlare. En ese caso, active el " Modo de desarrollo "o utilice la herramienta" Purgar Caché".

 5
Author: Leopoldo Sanczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-18 07:07:32

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

Si, por ejemplo, su aplicación envía una cookie con cada primera solicitud, entonces un script que desencadena 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é.

 4
Author: dwt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-02 10:17:07

Corro un script bash muy simple que tarda 10 segundos en hacer el trabajo y me envía un correo cuando está hecho.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" [email protected]
exit 0
 4
Author: MitchellK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-24 13:21:00
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.

 3
Author: colapsnux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-03 14:27:43

Para aquellos que han intentado eliminar los archivos de caché nginx, y o bien no ha funcionado o ha funcionado intermitentemente, 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 todavía puede ver una versión del archivo almacenado en caché, incluso después de que lo haya 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é de archivos por completo).

 3
Author: SilentMiles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-18 02:00:46

Yo también tuve este problema.

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

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

Cloudflare.com -> caching - > Purge Cache (Purgué todo) ¡Eso resolvió mi problema!

 3
Author: Asle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-19 09:39:24

Puede agregar configuración en nginx.conf como el siguiente.

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

 1
Author: austinzmchen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-07 03:53:22

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

Así que lo eliminé solo: sudo rm -rf /data/nginx/cache/

Espero que esto ayude a alguien.

 1
Author: Brilliant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 01:47:24

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 está en nginx.conf fue establecido:

proxy_cache_key $host$uri;
 0
Author: Ivan BlaBlaBla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 19:21:15

Estaba experimentando un tipo de problema similar:

Configuración del sistema y Problema: (En un virtualbox estoy web hosting usando ubuntu y nginx-actualizaciones de página web PHP no reflejan los cambios en el archivo css externo). Estoy desarrollando un sitio web en una máquina Windows y transfiriendo archivos a nginx a través de una carpeta compartida. Parece que nginx no recoge los cambios en el archivo css (refrescar de cualquier manera no ayuda. Cambiar el nombre del archivo css es lo único que funcionó)

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

UPDATE: Después de reiniciar el servidor VM, el problema regresó. Siguiendo las instrucciones en Solución hizo que el css respondiera a las actualizaciones de nuevo

 0
Author: Mr G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-17 14:36:42

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

En resumen:

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

Aquí está el script, adaptado a Ubuntu 16.04 LTS, con la caché ubicada 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;
    }
}
 0
Author: David Eyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 22:57:57