caching leverage - ¿Cómo borrar el caché de nginx?




static temp (17)

Utilizo nginx como servidor frontal, he modificado los archivos CSS, pero nginx todavía está 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 solo podemos eliminar el directorio de caché: var/cache/nginx , pero no hay tal directorio en mi servidor.

¿Qué debería hacer ahora?


Answers

Yo también tuve este problema.

  • No se pudo encontrar ninguna carpeta nginx / cache
  • el archivo de envío estaba apagado

Mi dominio usa cloudflare.com para DNS (¡excelente servicio!). Jajaja Allí estaba:

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


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


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 contenido almacenado en caché.


También puede omitir / re-caché en un archivo por archivo usando

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 cliente de resto 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 artículo y también reemplazará lo que está en el caché.


Hay dos respuestas en esta pregunta.

  • Uno para nginx como caché inversa
  • 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;
}

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

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

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


Tenga en cuenta que proxy_cache_bypass puede darle un gran 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 active 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é.


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.


Estaba experimentando una especie de problema similar:

Configuración del sistema y problema: (en un virtualbox estoy alojando un sitio web utilizando ubuntu y nginx - las actualizaciones de la página web de PHP no reflejaban los cambios en el archivo css externo). Estoy desarrollando un sitio web en Windows Machine y transfiriendo archivos a nginx a través de una carpeta compartida. Parece que nginx no recoge los cambios en el archivo css (la actualización de cualquier manera no ayuda. Cambiar el nombre del archivo css es solo lo que funcionó)

Solución: En la VM, busque el archivo compartido (archivo css en mi caso). Abra con nano y compárelo 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é funciona esto pero lo hizo en mi caso.

ACTUALIZACIÓN: Después de reiniciar el servidor VM, el problema regresó. Siguiendo las instrucciones en Solución, el css respondió a las actualizaciones nuevamente.


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

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

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

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


Tenemos un caché nginx (gigabytes) muy grande que ocasionalmente necesitamos limpiar. He desarrollado un script que borra instantáneamente 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 de disco.

En resumen:

  1. Mueva la carpeta de caché a una nueva ubicación (¡en el mismo sistema de archivos!) (Esto no interrumpe los descriptores de archivos abiertos)
  2. Vuelva a crear la carpeta de caché original, vacía
  3. Recargar Nginx (recarga elegante , donde nginx permite que los antiguos trabajadores terminen 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;
    }
}

Ejecuto una secuencia de comandos bash muy simple que toma todos los 10 segundos para hacer el trabajo y me envía un correo cuando termino.

#!/bin/bash
sudo service nginx stop
sudo rm -rf /var/cache/nginx/*
sudo service nginx start | mail -s "Nginx Purged" [email protected]
exit 0

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 borre solo un archivo para nginx actualizarlos.


Encontré esto útil

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

Busca, y si lo encuentras borra.


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

Cuando sendfile el sendfile de 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 preguntas


Hay un método correcto para eliminar solo los archivos de caché, que coinciden 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 se estableció en nginx.conf:

proxy_cache_key $host$uri;

Recientemente resolví esto usando Python. Aquí el código (debería ser fácil de adoptar a otros idiomas):

def import_tag(pattern, name, **kw):
    if name[0] == "/":
        name = name[1:]
    # Additional HTML attributes
    attrs = ' '.join(['%s="%s"' % item for item in kw.items()])
    try:
        # Get the files modification time
        mtime = os.stat(os.path.join('/documentroot', name)).st_mtime
        include = "%s?%d" % (name, mtime)
        # this is the same as sprintf(pattern, attrs, include) in other
        # languages
        return pattern % (attrs, include)
    except:
        # In case of error return the include without the added query
        # parameter.
        return pattern % (attrs, name)

def script(name, **kw):
    return import_tag("""<script type="text/javascript" """ +\
        """ %s src="/%s"></script>""", name, **kw)

def stylesheet(name, **kw):
    return import_tag('<link rel="stylesheet" type="text/css" ' +\
        """%s href="/%s">', name, **kw) 

Este código básicamente agrega la marca de tiempo de los archivos como un parámetro de consulta a la URL. La llamada de la siguiente función.

script("/main.css")

resultará en

<link rel="stylesheet" type="text/css"  href="/main.css?1221842734">

La ventaja, por supuesto, es que nunca tendrá que cambiar su html nuevamente, al tocar el archivo CSS se activará automáticamente una invalidación de caché. Funciona muy bien y la sobrecarga no se nota.





caching nginx