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

143

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:

  1. Establecer una fecha de vencimiento en el elemento en caché
  2. 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?

Continuación
fuente
No probado, pero de gumroad.com/l/ngx_purge : "ngx_purge es un módulo Lua puro para Nginx que permite al usuario purgar objetos del caché nginx".
Jaime Hablutzel

Respuestas:

97

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

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;
    }
  }
}
Casey
fuente
77
Este es un primer paso razonable para nuevas aplicaciones que no tienen 20k / req / s.
55
@Barry, ¿cuál será el segundo paso?
Jürgen Paul
42
@Legit - No lo sé, pero tradicionalmente el último paso es "Profit" :-)
Stephen C
Lamentablemente, no funciona con nginx 1.11. Como la última actualización fue hace unos 3 años, parece que ya no es la solución.
izogfif
¿Qué significa el: inactive=600msignifica? ¿No se inactivesupone que es tiempo? `[inactive=time]
NeverEndingQueue
47

Puede invalidar específicamente las páginas en caché a través de

proxy_cache_bypass       

Digamos que desea almacenar en caché una página, configure la memoria 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 desee invalidar esa página y volver a almacenar en caché

Hacer una llamada curl secreta con el encabezado

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

Lo invalidará y lo almacenará en caché.

Funciona desde nginx 0.7.

Como bono adicional, add_header X-Cache-Statusse puede usar para verificar si la página es de caché o no.

Cherian
fuente
Esto solo puede actualizar las páginas en caché cuando la nueva página también se puede almacenar en caché. Si ha eliminado una página (ahora el backend sirve 404 u otros errores), la página ahora envía un Set-Cookie o un encabezado "Content-Control: private", el contenido almacenado en caché no será "invalidado".
rbu
36

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 PURGEoperació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.

Dave Cheney
fuente
¿Podría explicar a qué se refería con "renombrar el archivo o usar alguna forma de buster de caché de cadenas de consulta"? No estoy seguro de entender por qué no es una buena idea usar una operación como PURGE.
Continuación
55
+1 para barniz. Siempre es mucho mejor usar las herramientas adecuadas para el trabajo.
Tom O'Connor
44
@ debajo: casi no hay esperanza de tocar el barniz en las arenas de rendimiento y versatilidad. Esto está respaldado por uno de los principales desarrolladores de kernel de FreeBSD y un equipo dedicado con sede en Europa. Varnish está en producción en twitter, heroku y muchos más.
2
El ejemplo más simple de un destructor de caché es agregar un número de versión en una cadena de consulta a un recurso estático, por lo que style.css se convierte en style.css? 123. Cuando desee insertar una nueva versión del archivo, cambie la url del recurso a style.css? 124 y ahora las memorias caché lo seleccionarán como un activo completamente nuevo para almacenar en caché por separado. Apache servirá el archivo style.css con cualquier cadena de consulta agregada, por lo que no se requieren cambios en el archivo real.
chmac
3
Si es posible, es mejor poner el buster de caché en el nombre del archivo, style.v123.cssya que algunos cachés no almacenarán en caché las solicitudes que tengan una cadena de consulta.
Noah McIlraith
8

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
8

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.

server  {
        # Other settings
        proxy_pass_header       Set-Cookie; # I want to cache logged-in users
        proxy_ignore_headers    X-Accel-Redirect;
        proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;
        if ($http_cache_control ~ "max-age=0") {set $eac 1;}
        proxy_cache_bypass $eac;
}

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 $eacvariable en 1.

Randy Wallace
fuente
4

Creo que NginxHttpProxyModule es capaz de atender las solicitudes http. Busque las directivas que comienzan con:

proxy_cache

Sí, es posible controlar el comportamiento de la memoria caché mediante directivas como:

proxy_cache_valid
Taras Chuhay
fuente
3

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.

womble
fuente
La documentación está aquí: wiki.nginx.org/NginxHttpProxyModule#proxy_cache
rmalayter
2

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é.

Martin Murphy
fuente
De Verdad? Parece que ngnix coincide con el etag y nunca habla con la aplicación para averiguar si hay un etag actualizado.
John Naegle
2

Puede controlar la caducidad de la memoria caché de Nginx con múltiples directivas / parámetros:

  • proxy_cache_valid 200 302 10m;
  • agregando uno de los encabezados HTTP a continuación (la prioridad es importante; consulte mi publicación de blog ):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • El inactiveparámetro en la proxy_cache_pathdirectiva:

    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:

    echo -n ‘httpczerasz.com/time.php’ | md5sum
    
  • eliminar el archivo del sistema de archivos:

    rm /data/nginx/cache/1/27/2bba799df783554d8402137ca199a271
    
czerasz
fuente
1

Para futuros visitantes: mientras tanto, el proxy inverso nginx tiene caché integrado y los documentos están disponibles en:

Sintaxis: zona proxy_caché | apagado;

Valor predeterminado: proxy_cache desactivado;

Contexto: http, servidor, ubicación

Define una zona de memoria compartida utilizada para el almacenamiento en caché. La misma zona se puede usar en varios lugares. El valor del parámetro puede contener variables (1.7.9). El parámetro off desactiva el almacenamiento en caché heredado del nivel de configuración anterior.

Tarik Huclaslun
fuente
Hola Tarik, la pregunta era muy específica sobre lo que se debe lograr, y está un poco más allá de 'solo habilitar caché'.
asdmin
0
fastcgi_cache_path / opt / nginx-cache niveles = 2: 2 keys_zone = img: 50m;

    ubicación / img / {
        fastcgi_pass $ backend;
        incluir fcgi_params;
        fastcgi_intercept_errors off;   
        fastcgi_cache_key $ server_addr $ request_uri;       
        fastcgi_cache img;
        fastcgi_cache_valid cualquier 1m;
        Fastcgi_hide_header Set-Cookie;
    }

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.

lexsys
fuente
La pregunta original era sobre el uso de nginx frente a Apache, no frente a la aplicación fastcgi manejada por nginx.
Graham Dumpleton el
0

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".

sajal
fuente