Nginx: actualice el caché solo si el archivo ha cambiado, ¿es posible?

Nginx: actualice el caché solo si el archivo ha cambiado, ¿es posible?

Estoy usando nginx como proxy inverso y para almacenamiento en caché. Actualmente, el caché de la ubicación "/test" se renovará cada 2 horas: "proxy_cache_valid 200 302 301 304 2h;"

¿Es posible renovar el caché sólo si un archivo ha cambiado?

¡Gracias!

Respuesta1

Esto debe manejarse de forma genérica.

Si un archivo está almacenado en caché en un navegador, y el navegador solicita ese archivo nuevamente y el archivo se ha eliminado de la caché del servidor, el servidor seguirá mirando el if-modified-sinceencabezado de la solicitud.

El servidor verificará ese valor de fecha y hora y, si determina que no se produjo ningún cambio, el servidor enviará una 304respuesta, que le indica al navegador que está bien cargar la versión en caché y que el objeto real no se envía al servidor y se descarga nuevamente.

Si se cambia el valor, el objeto será el servidor y la copia de la caché se actualizará.

https://www.keycdn.com/support/if-modified-since-http-header

En mi humilde opinión, el almacenamiento en caché es algo que realmente deberías controlar con Cache-Controllos encabezados, en lugar de la configuración del servidor.

Las opciones de configuración del servidor están ahí como medida de seguridad para cuando Cache-Control no existe o está configurado de forma ilógica.

Respuesta2

Supongo que estamos hablando de contenido generado que aún no es un archivo estático en su servidor web (los archivos estáticos en su servidor web suelen ser lo suficientemente rápidos).

La pregunta principal es cómo informar a Nginx que se ha modificado el contenido almacenado en caché.

La revalidación suena bien, pero tiene el impacto de que, en su mayoría, el proceso de buscar actualizaciones es tan costoso como generarlas. Entonces esa no es una opción real.

La mejor práctica es Purgar el contenido en caso de que se haya actualizado (por ejemplo, se haya modificado en su CMS). La purga es el proceso para invalidar los objetos almacenados en caché. Nginx admite Purge solo en la versión NginxPlus. Sin embargo, puedes hacer casi lo mismo recargando el objeto almacenado en caché.

A continuación se muestra un sencillo procedimiento:

Configuración de Nginx

...

# default location
location / {
    try_files                   $uri @php;
}

# PHP handler
location @php {
    try_files                   $uri /index.php;

    access_log                  /var/log/nginx/access.log;

    # include fastcgi_params
    include                     fastcgi_params;

    # how to connect to PHP-FPM
    fastcgi_pass                php-fpm;

    # enable caching
    fastcgi_cache               phpfpm;

    # don't look for existing cache objects with HTTP header X-Purge
    fastcgi_cache_bypass        $http_x_purge;
}

...

Curl para purgar un documento

curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"

información relacionada