Recientemente escuché que Nginx ha agregado el almacenamiento en caché a su función de proxy inverso. Miré a mi alrededor pero no pude encontrar mucha información al respecto.
Quiero configurar Nginx como un proxy inverso de almacenamiento en caché frente a Apache / Django: para tener solicitudes de proxy Nginx para algunas (pero no todas) páginas dinámicas a Apache, luego almacenar en caché las páginas generadas y atender las solicitudes posteriores de esas páginas desde el caché.
Idealmente, me gustaría invalidar el caché de 2 maneras:
- Establecer una fecha de vencimiento en el elemento en caché
- Invalidar explícitamente el elemento almacenado en caché. Por ejemplo, si mi backend de Django ha actualizado ciertos datos, me gustaría decirle a Nginx que invalide el caché de las páginas afectadas
¿Es posible configurar Nginx para hacer eso? ¿Cómo?
proxy
nginx
reverse-proxy
varnish
Continuación
fuente
fuente
Respuestas:
No creo que haya una forma de invalidar explícitamente los elementos en caché, pero aquí hay un ejemplo de cómo hacer el resto. Actualización: como mencionó Piotr en otra respuesta, hay un módulo de purga de caché que puede usar. También puede forzar una actualización de un elemento almacenado en caché utilizando proxy_cache_bypass de nginx; consulte la respuesta de Cherian para obtener más información.
En esta configuración, los elementos que no se almacenan en caché se recuperarán de example.net y se almacenarán. Las versiones en caché se servirán a futuros clientes hasta que ya no sean válidas (60 minutos).
Se respetarán los encabezados HTTP Cache-Control y Expires, por lo que si desea establecer explícitamente una fecha de vencimiento, puede hacerlo estableciendo los encabezados correctos en lo que sea que esté representando.
Hay muchos parámetros que puede ajustar: consulte la documentación del módulo Proxy nginx para obtener más información sobre todo esto, incluidos detalles sobre el significado de las diferentes configuraciones / parámetros: http://nginx.org/r/proxy_cache_path
fuente
inactive=600m
significa? ¿No seinactive
supone que es tiempo? `[inactive=time]
Puede invalidar específicamente las páginas en caché a través de
Digamos que desea almacenar en caché una página, configure la memoria caché de esta manera
Ahora, cuando desee invalidar esa página y volver a almacenar en caché
Hacer una llamada curl secreta con el encabezado
Lo invalidará y lo almacenará en caché.
Funciona desde nginx 0.7.
Como bono adicional,
add_header X-Cache-Status
se puede usar para verificar si la página es de caché o no.fuente
Le sugiero que pruebe Varnish . Varnish está específicamente diseñado como un caché de proxy inverso. Honrará todos los encabezados de control de caché que envíe desde el servidor de origen, lo que satisface su primera solicitud.
Para su segunda solicitud, invalidación explícita. Mi recomendación es cambiar el nombre de la url del recurso que desea invalidar, ya sea renombrando el archivo o utilizando alguna forma de buster de caché de cadenas de consulta. Varnish tiene una
PURGE
operación que eliminará el recurso de la memoria caché de Varnish, pero no le dará control sobre ninguna otra memoria caché entre usted y el usuario. Como ha dicho que desea purgar explícitamente un recurso, los encabezados de control http estándar no lo ayudarán. En esos casos, la forma más infalible de derrotar el almacenamiento en caché de un recurso es cambiarle el nombre.fuente
style.v123.css
ya que algunos cachés no almacenarán en caché las solicitudes que tengan una cadena de consulta.Para invalidar páginas seleccionadas, puede usar el parche "cache_purge" para nginx-0.8.x que hace exactamente lo que desea;)
Está disponible aquí .
fuente
La mayoría de las herramientas de almacenamiento en caché (Citrix) permiten una actualización forzada (Ctrl + r) para repoblar una página almacenada en caché.
Aquí hay un truco que encontré para hacer algo similar en nginx.
Esto supone que cuando haces Ctrl + r en tu navegador, el encabezado Cache-Control tiene max-age = 0 en su solicitud. Sé que Chrome hace esto, pero no lo he probado en otros navegadores. Agregar más campos de encabezado puede ser fácil, simplemente agregando más declaraciones if que establecen la
$eac
variable en 1.fuente
El almacenamiento en caché es una función bastante nueva en nginx (y no está tan bien documentada por ahora), pero es lo suficientemente estable como para usarse en producción.
Usa documentación en inglés
Preguntar en listas de correo
Traduzca la documentación rusa con algo como Google Translate
Utilizar barniz
fuente
Creo que NginxHttpProxyModule es capaz de atender las solicitudes http. Busque las directivas que comienzan con:
Sí, es posible controlar el comportamiento de la memoria caché mediante directivas como:
fuente
Basado en el hecho de que no puedes encontrar documentos en él, sería un poco cauteloso al depender de él en la producción. ¿Has considerado el barniz? Es mi "nginx de servidores proxy inversos", pequeño, liviano, que hace un trabajo y lo hace bien.
fuente
Si usa eTags en su aplicación y pone nginx delante, se encargará de la caducidad por usted, porque si el eTag cambia, invalidará el caché.
fuente
Puede controlar la caducidad de la memoria caché de Nginx con múltiples directivas / parámetros:
proxy_cache_valid 200 302 10m;
Expires
Cache-Control
X-Accel-Expires
El
inactive
parámetro en laproxy_cache_path
directiva:proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;
Recomiendo mi publicación de blog si desea obtener más información sobre el almacenamiento en caché de Nginx.
El tema de la purga es realmente interesante ya que esta característica solo existe en Nginx Plus (edición comercial de Nginx). Realmente me gusta la respuesta de @ randy-wallace. Pero también hay otras posibilidades como el módulo ngx_cache_purge .
Lo más simple que puede hacer es eliminar el archivo en caché manualmente:
genera tu clave hash:
eliminar el archivo del sistema de archivos:
fuente
Para futuros visitantes: mientras tanto, el proxy inverso nginx tiene caché integrado y los documentos están disponibles en:
fuente
Esto crea caché para / img / location. Está en / opt / nginx-cache. Los objetos se almacenan en caché durante 1 minuto.
Puede escribir diferentes códigos de respuesta en lugar de cualquiera.
Ahora no puede invalidar el caché para las páginas seleccionadas. Quizás en 0.8.x sea posible.
fuente
Hay un complemento nginx llamado ncache que dice ser "una base de sistema de caché web en el servidor web nginx. Más rápido y más eficiente que el calamar".
fuente