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


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é delante de Apache / Django: para tener solicitudes de proxy Nginx para algunas (pero no todas) las páginas dinámicas a Apache, luego almacenar en caché las páginas generadas y atender las solicitudes subsiguientes para esas páginas desde el caché.

Idealmente, me gustaría invalidar el caché de 2 maneras:

  1. Establecer una fecha de caducidad en el elemento almacenado en caché
  2. Para invalidar explícitamente el elemento en caché. P.ej. Si mi backend 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?


139
2018-06-24 01:35


origen




Respuestas:


No creo que haya una manera de invalidar explícitamente los elementos almacenados en caché, pero aquí hay un ejemplo de cómo hacer el resto. Actualizar: Como lo mencionó Piotr en otra respuesta, hay una módulo de purga de caché que puedes usar. También puede forzar una actualización de un elemento en caché usando el proxy_cache_bypass de nginx - vea La respuesta de cherian para más información.

En esta configuración, los elementos que no están en caché se recuperarán de example.net y se almacenarán. Las versiones en caché se entregarán a futuros clientes hasta que dejen de ser válidas (60 minutos).

Se respetarán los encabezados HTTP de Cache-Control y Expires, por lo que si desea establecer explícitamente una fecha de vencimiento, puede hacerlo configurando los encabezados correctos en lo que sea que desee.

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;
    }
  }
}

94
2017-09-23 20:01



Este es un primer paso razonable para las nuevas aplicaciones que no tienen 20k / req / s. - Barry
@Barry, ¿cuál será el segundo paso? - Jürgen Paul
@Legit - No lo sé, pero tradicionalmente el último paso es "Beneficio" :-) - Stephen C
Lamentablemente, no funciona con nginx 1.11. Desde que la última actualización fue hace aproximadamente 3 años, parece que esta ya no es la solución. - izogfif


Usted puede específicamente invalidar en caché páginas a través

proxy_cache_bypass       

Digamos que quieres almacenar en caché una página, configurar 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 quieras invalidar esa página y caché de nuevo 

Haz una llamada secreta con el encabezado

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

Lo invalidará y lo almacenará en caché.

Trabajos desde nginx 0.7.

Como bono adicional el add_header X-Cache-Status se puede utilizar para comprobar si la página es de caché o no.


46
2017-11-26 04:00



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 (404 u otros errores ahora son atendidos por el servidor), la página ahora envía un Set-Cookie o un encabezado "Content-Control: private", el contenido almacenado en caché no será "invalidado". - rbu


Te sugiero que des Barniz un intento. El barniz está diseñado específicamente como un caché de proxy inverso. Respetará 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 fuerte recomendación es cambiar el nombre de la url del recurso que desea invalidar, ya sea cambiando el nombre del archivo o usando alguna forma de buscador de caché de cadenas de consulta. El barniz tiene un PURGE operación que eliminará el recurso del caché de Varnish, pero no le dará control sobre ningún otro 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 anular el almacenamiento en caché de un recurso es cambiar su nombre.


36
2018-06-24 02:43



¿Podría explicar qué quiso decir con "cambiar el nombre del archivo o usar algún tipo 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. - Continuation
+1 para barniz. Siempre es mucho mejor usar las herramientas adecuadas para el trabajo. - Tom O'Connor
@below: 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. Barniz está en producción en twitter, heroku y muchos más. - Barry
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 quiera enviar una nueva versión del archivo, cambie la url del recurso a style.css? 124 y ahora los cachés lo recogerán como un activo completamente nuevo que se almacenará en caché por separado. Apache servirá el archivo style.css con cualquier cadena de consulta adjunta, por lo que no se requieren cambios en el archivo real. - chmac
Si es posible, es mejor colocar el destructor de caché en el nombre del archivo, como style.v123.css porque algunas cachés no almacenan en caché las solicitudes que tienen una cadena de consulta. - Noah McIlraith


Para invalidar las páginas seleccionadas, puede usar el parche "cache_purge" para nginx-0.8.x que hace exactamente lo que quiere;)

Esta disponible aquí.


7
2017-11-17 07:38





La mayoría de las herramientas de almacenamiento en caché (Citrix) permiten una actualización forzada (Ctrl + r) para volver a llenar una página 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 hace un Ctrl + r en su navegador, el encabezado Cache-Control tiene una edad máxima = 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 si las declaraciones que establecen el $eac variable a 1.


6
2018-04-10 23:02





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 ser utilizado en la producción.


4
2018-06-24 02:25





Yo creo NginxHttpProxyModule Es capaz de hacer peticiones http. Busque las directivas que comienzan con:

proxy_cache

Sí, es posible controlar el comportamiento del caché a través de directivas como:

proxy_cache_valid

3
2018-06-24 10:12





Basado en el hecho de que no puedes encontrar documentos en él, sería un poco cauteloso al confiar en él en la producción. ¿Has considerado el barniz? Es mi "nginx de proxies inversos", pequeño, ligero, haciendo un trabajo y haciéndolo bien.


2
2018-06-24 01:38



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


Si utiliza eTags en su aplicación y coloca nginx delante de ella, se encargará de la caducidad, ya que si la etiqueta electrónica cambia, invalidará la memoria caché.


1
2017-11-16 15:20



De Verdad? Se ve como ngnix coincide con el etag y nunca habla con la aplicación para averiguar si hay un etag actualizado. - John Naegle


Puede controlar la caducidad del 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 - revisa mi blog):
    • Expires
    • Cache-Control
    • X-Accel-Expires
  • la inactive parámetro en el proxy_cache_path directiva:

    proxy_cache_path /data/nginx/cache keys_zone=one:10m inactive=60m;

yo recomiendo mi blog Si desea obtener más información sobre el almacenamiento en caché 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 la módulo ngx_cache_purge.

Lo más simple que puedes 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
    

1
2018-03-31 18:06





fastcgi_cache_path / opt / nginx-cache levels = 2: 2 keys_zone = img: 50m;

    ubicación / img / {
        fastcgi_pass $ backend;
        incluye fcgi_params;
        fastcgi_intercept_errors desactivado;
        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.

Puedes escribir diferentes códigos de respuesta en lugar de cualquiera.

Ahora no puede invalidar el caché de las páginas seleccionadas. Tal vez en 0.8.x sea posible.


0
2018-06-24 08:59



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