146 votos

Cómo configurar Nginx como el almacenamiento en caché de proxy inverso?

He oído recientemente que Nginx ha añadido el almacenamiento en caché de su característica de proxy inverso. Miré a mi alrededor, pero no podía encontrar mucha información sobre él.

Quiero configurar Nginx como el almacenamiento en caché de proxy inverso en frente de Apache/Django: tener Nginx solicitudes de proxy para algunos (pero no todos) de páginas dinámicas para Apache, caché de las páginas generadas y servir las peticiones posteriores de las páginas de la caché.

Idealmente me gustaría invalidar la memoria caché de 2 maneras:

  1. Establecer una fecha de caducidad en el elemento almacenado en caché
  2. Explícitamente invalidar el elemento almacenado en caché. E. g. si mi backend Django ha actualizado ciertos datos, me gustaría compartir con Nginx para invalidar la caché de las páginas afectadas

Es posible configurar Nginx para hacer eso? Cómo?

98voto

Wessam Zeidan Puntos 1564

No creo que hay una forma explícita de invalidar los elementos almacenados en caché, pero aquí es un ejemplo de cómo hacer el resto. Actualización: Como se ha mencionado por Piotr en otra respuesta, hay una caché de purga módulo que puede utilizar. También puede forzar una actualización de un elemento en caché utilizando nginx del proxy_cache_bypass - ver Cherian la respuesta para obtener más información.

En esta configuración, los elementos que no están en caché se recuperan de example.net y se almacena. Las versiones en caché se sirve a los futuros clientes hasta que ya no son válidos (60 minutos).

Su Cache-Control y Caduca encabezados será un honor, así que si usted desea establecer explícitamente una fecha de vencimiento, usted puede hacerlo mediante el ajuste correcto de los encabezados en lo que usted está proxy.

Hay un montón de parámetros que se pueden ajustar - ver el Proxy nginx documentación del módulo para obtener más información acerca de todo esto, incluyendo detalles sobre el significado de las diferentes opciones de configuración/parámetros: http://nginx.org/r/proxy_cache_path

http {
  proxy_cache_path  /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
  proxy_temp_path /var/www/cache/tmp; 


  server {
    location / {
      proxy_pass http://example.net;
      proxy_cache my-cache;
      proxy_cache_valid  200 302  60m;
      proxy_cache_valid  404      1m;
    }
  }
}

48voto

Cherian Puntos 522

Específicamente puede invalidar en caché de páginas a través de

proxy_cache_bypass       

Digamos que usted desea almacenar en caché de una página, configurar la caché de esta manera

location = /pageid {
  proxy_pass http://localhost:82;
  proxy_set_header   Host             $host;
  proxy_set_header   X-Real-IP        $remote_addr;
  proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  proxy_ignore_headers Set-Cookie; 
  proxy_ignore_headers Cache-Control; 
  proxy_cache_bypass        $http_secret_header;
  add_header X-Cache-Status $upstream_cache_status;
}

Ahora, cuando usted quiere invalidar esa página y la memoria caché de nuevo

¿Un secreto curl de llamada con el encabezado

curl "www.site.com/pageid" -s -I -H "secret_header:true" 

Invalida y la memoria caché.

Obras de nginx 0.7.

Como un sobresueldo añadido el add_header X-Cache-Status puede ser utilizado para comprobar si la página es de la memoria caché o no.

37voto

Dave Cheney Puntos 13302

Le sugiero dar el Barniz de un intento. El barniz está diseñado específicamente como un proxy inverso de la caché. Se honrará todos los encabezados de control de caché se envía desde el servidor de origen, que cumple su primera solicitud.

Para su segunda petición explícita de la invalidación. Mi recomendación fuerte es cambiar el nombre de la dirección url del recurso que desea invalidar, cambiando el nombre del archivo o el uso de alguna forma de cadena de consulta de la caché de buster. El barniz tiene un PURGE de la operación de que se retire el recurso de Barniz de la memoria caché, pero no le dará el control sobre cualquier otra caché entre usted y el usuario. Como has dicho que quiere explícitamente purgar un recurso, http estándar de control de cabeceras no te ayudará. En que casos la más infalible para vencer el almacenamiento en caché de un recurso es cambiarle el nombre.

5voto

Toby Allen Puntos 6734

El almacenamiento en caché es bastante nueva función en nginx (y no tan bien documentado por ahora), pero lo suficientemente estable como para ser utilizados en la producción.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: