¿Cómo borrar el caché de nginx?

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

Intenté reiniciar nginx, no tuve éxito y busqué en Google, pero no encontré 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é debería hacer ahora?

Tenía exactamente el mismo problema: estaba ejecutando mi nginx en Virtualbox. No tuve el caché activado. Pero parece que se configuró sendfile en nginx.conf y eso estaba causando el problema. @kolbyjack lo mencionó arriba en los comentarios.

Cuando sendfile el 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 un entorno de máquina virtual, o al menos cuando se ejecuta a través de Virtualbox. Al desactivar esta configuración en nginx, el archivo estático se sirve a través de un método diferente y sus cambios se reflejarán de inmediato y sin dudas.

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 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é, usar curl o cualquier cliente de reposo para realizar 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 artículo y también reemplazará lo que está en la memoria caché.

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

Si lo hizo, sin embargo, según el autor de nginx , basta con quitar todos los archivos del directorio de caché.

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

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 actualizarlos a nginx.

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

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. Tenga mucho cuidado con el comando rm -rf , si se encuentra en el directorio incorrecto, puede eliminar todo el disco duro.

Encontré esto útil

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

Busque, y si lo encuentra, luego elimine.

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

Tenga en cuenta que proxy_cache_bypass puede causarle un gran daño si su aplicación no devuelve una respuesta almacenable 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 una secuencia de comandos 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 en caché.

 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.

Para aquellos que han intentado borrar los archivos de caché de nginx, y o bien no han funcionado o han 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 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 si esto es esencialmente lo mismo que deshabilitar completamente la caché de archivos).

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!). Aha! Allí estaba:

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

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

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

Puede agregar la configuración en nginx.conf como la 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 el contenido en caché.

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

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

Espero que esto ayude a cualquiera.

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

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

Esto elimina todos los archivos de caché, que coinciden con KEY “yahoo / *”, si se configuró nginx.conf:

 proxy_cache_key $host$uri; 

Estaba experimentando un tipo de problema similar:

Configuración y problema del sistema: (En una virtualbox, soy un alojamiento web que usa ubuntu y nginx; las actualizaciones de la página web PHP no reflejan los cambios al archivo css externo). Estoy desarrollando un sitio web en Windows Machine y transfiero archivos a nginx a través de una carpeta compartida. Parece que nginx no capta los cambios en el archivo css (refrescar de cualquier forma 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 compartido (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.

ACTUALIZACIÓN: después de reiniciar el servidor de VM, el problema volvió. Siguiendo las instrucciones de Solución, el css responde a las actualizaciones nuevamente

Tenemos una gran caché de nginx (gigabytes) que ocasionalmente necesitamos limpiar. He elaborado una secuencia de comandos que borra al instante la memoria caché (en lo que respecta a Nginx) y luego elimina el directorio de la memoria caché sin privar a la aplicación principal de E / S del 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. Recrea la carpeta de caché original, vacía
  3. Recargar Nginx (recarga graciosa , donde nginx permite que los trabajadores mayores finalicen las solicitudes en progreso)
  4. Eliminar datos viejos 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; } }