¿Qué proxy inverso admite encabezados HTTP / 1.1 ETag y If-None-Match?

8

Estoy desarrollando un sistema de almacenamiento en caché para una plataforma de comercio electrónico que utilizará un proxy inverso para el almacenamiento en caché. Planeo manejar la invalidación mediante el uso de encabezados HTTP / 1.1 adecuados. Es decir, estableceré un ETag en la primera generación del contenido y almacenaré en caché ese valor de ETag en la aplicación. El encabezado Cache-Control especificará "must-revalidate", por lo que el proxy debe establecer el encabezado If-None-Match en solicitudes posteriores con el ETag. La aplicación buscará el valor de ETag en caché y, si coincide, enviará una respuesta 304, de lo contrario generará una respuesta completa de 200.

Esperaba usar nginx, pero no puedo asegurar con certeza que sea compatible con ETags (¿los documentos indican que no es así, pero tal vez están desactualizados?). El barniz es otra opción, pero tampoco soy positivo aquí ...

¿Qué servidores proxy inversos tienen soporte completo para ETags? En realidad, me gustaría almacenar varias versiones en caché para poder hacer cosas como pruebas divididas sin tener que desactivar la memoria caché. Es decir, HTTP / 1.1 especifica que un cliente puede enviar If-None-Match con múltiples valores de ETag y el servidor debe responder con qué ETag coincide (si corresponde). Si el proxy inverso conserva varias copias en lugar de solo el último valor visto y deja que el servidor especifique en cada solicitud cuál usar, sería ideal.

ColinM
fuente

Respuestas:

2

Acabo de comprobar en el código fuente del barniz y aunque se admite If-Modified-Sincey If-None-Matchcabeceras, que no es compatible must-revalidateen Cache-Control. Los únicos atributos admitidos en Cache-Controlson max-agey s-max-age.

Referencias

Jérôme R
fuente
Gracias. No sé mucho sobre Varnish VCL, pero ¿es posible especificar el uso de VCL para revalidar siempre dado que Varnish parece admitir la revalidación?
ColinM
Acabo de encontrar que la rama "experimental-ims" de Varnish parece agregar soporte completo para If-None-Match. Con suerte, finalmente se fusionará en una versión estable. varnish-cache.org/trac/wiki/BackendConditionalRequests
ColinM
2

nginx requiere módulos de terceros para admitir ETag. Y hay dos de ellos.

Michael Hampton
fuente
El módulo estático etags es para generar etags, no para almacenar en caché el contenido con etags. Del mismo modo, el módulo etags dinámico genera etags para contenido dinámico para uso ascendente, no para uso de proxy inverso. Sin embargo, creo que nginx 1.3 agregó soporte oficial para etags con servidores proxy inversos ..
ColinM
1
Solo para referencia futura, nginx admite ETag e If-None-Match a partir de 1.7.3, pero todavía solo puede almacenar en caché un resultado para una url determinada, por lo que no llamaría a este soporte completo. Es decir, no puede tener múltiples respuestas almacenadas en caché y negociadas con el servidor durante la revalidación. Ver trac.nginx.org/nginx/ticket/101
ColinM
1

Corrígeme si me equivoco, y sé que esta es una publicación antigua, pero me gustaría comentar para los nuevos transeúntes. Creo que un caché de proxy inverso no ayuda tanto como te gustaría cuando usas ETags.

Los mecanismos de validación de almacenamiento en caché utilizan el servidor de origen para validar si la ETag (o la fecha de la última modificación) en la solicitud sigue siendo válida (coincide o no con los recursos etag, dependiendo de qué encabezado se use o se haya / no se haya modificado desde la fecha indicada en la solicitud).

Esto significa que una memoria caché de proxy inverso, como Varnish, aún pasará esa solicitud al servidor de origen. Puede responder con la solicitud en lugar de que el servidor la maneje, pero no guardó el viaje de ida y vuelta al servidor de origen.

Los navegadores pueden almacenar en caché las respuestas y manejar una respuesta 304 en cualquier caso, por lo que la caché privada del usuario puede ser más adecuada para manejar esto que usar un proxy inverso (YMMV, especialmente a escala, y dependiendo de su caso de uso, por supuesto). desea hacer suposiciones sobre sus aplicaciones).

De la especificación 13.3 :

Cuando un caché tiene una entrada obsoleta que le gustaría usar como respuesta a la solicitud de un cliente, primero tiene que consultar con el servidor de origen (o posiblemente un caché intermedio con una nueva respuesta) para ver si su entrada en caché todavía es utilizable . Llamamos a esto "validación" de la entrada de caché. Como no queremos tener que pagar los gastos generales de retransmitir la respuesta completa si la entrada en caché es buena, y no queremos pagar los gastos generales de un viaje de ida y vuelta adicional si la entrada en caché no es válida, el protocolo HTTP / 1.1 admite El uso de métodos condicionales.

y luego nota 13.3.4 :

Un proxy de almacenamiento en caché HTTP / 1.1, al recibir una solicitud condicional que incluye una fecha de Última modificación y una o más etiquetas de entidad como validadores de caché, NO DEBE devolver una respuesta almacenada en caché local al cliente a menos que esa respuesta en caché sea coherente con todos los campos de encabezado condicional en la solicitud.

Por lo tanto, Varnish puede devolverle una respuesta, pero aún tiene un viaje de ida y vuelta al servidor. Si puede usar un caché de aplicaciones como APC o memcache, entonces eso podría valer la pena. Sin embargo, el almacenamiento en caché de validación es generalmente mejor para el ahorro de ancho de banda que para el ahorro de recursos del servidor.

El almacenamiento en caché de validación puede dejarse en manos del cliente (navegador o código api).

El uso del modelo de caducidad para el almacenamiento en caché es donde realmente brilla un caché de proxy inverso. Esto le permite omitir golpear el servidor de origen por completo. Utilizando Expires, Cache-Control, Date, etc, es el mejor (de nuevo, la OMI) para un mecanismo de caché de proxy inverso como el caché puede devolver la respuesta, suponiendo que no es rancio, sin tener que golpear el servidor de origen.

fideloper
fuente
El caso de uso que tenía en mente para esta pregunta es hacer que el proxy se revalide con el servidor de origen y el servidor de origen devuelva 304 si el ETag coincide con el ETag que se almacenaría en caché para un registro dado. Es decir, el ETag se generaría aleatoriamente cuando la página se renderiza y guarda por primera vez con la clave principal para ese registro. Si se modifica el registro, el ETag se borra.
ColinM