ruby-on-rails caching http-headers varnish

ruby on rails - Cómo controlar el barniz y un navegador usando Cache-Control: encabezado de máxima edad en un entorno Rails?



ruby-on-rails caching (1)

Esa es una pregunta muy buena y válida, y muy común con los proxies inversos.

El problema es que solo hay una propiedad de control de caché y está destinada para el navegador del cliente (caché privada) y / o un servidor proxy (caché compartida). Si no desea que los servidores proxy de terceros guarden en caché su contenido, y desea que cada solicitud sea atendida por su barniz (o por su servidor Rails), debe enviar el encabezado de control de caché apropiado de Varnish.

La modificación del encabezado de Cache-Control enviado por el back-end se trata en detalle en https://www.varnish-cache.org/trac/wiki/VCLExampleLongerCaching

Puede abordar la solución desde dos ángulos diferentes. Si desea definir max-age en el back-end de Rails, por ejemplo, para especificar TTL diferentes para diferentes objetos, puede usar el método descrito en el enlace anterior.

Otra solución es no enviar encabezados de control de caché desde el backend, y en su lugar definir los TTL deseables para los objetos en barniz vcl_fetch (). Este es el enfoque que hemos tomado.

Tenemos un TTL predeterminado de 600 segundos en Varnish y definimos TTL más largos para las páginas que definitivamente se purgan explícitamente cuando se realizan cambios. Aquí está nuestra definición actual de vcl_fetch ():

sub vcl_fetch { if (req.http.Host ~ "(forum|discus)") { # Forum pages are purged explicitly, so cache them for 48h set beresp.ttl = 48h; } if (req.url ~ "^/software/") { # Software pages are purged explicitly, so cache them for 48h set beresp.ttl = 48h; } if (req.url ~ "^/search/forum_search_results" ) { # We don''t want forum search results to be cached for longer than 5 minutes set beresp.ttl = 300s; } if(req.url == "/robots.txt") { # Robots.txt is updated rarely and should be cached for 4 days # Purge manually as required set beresp.ttl = 96h; } if(beresp.status == 404) { # Cache 404 responses for 15 seconds set beresp.http.Cache-Control = "max-age=15"; set beresp.ttl = 15s; set beresp.grace = 15s; } }

En nuestro caso, no enviamos encabezados de control de caché en absoluto desde los servidores backend web.

Recientemente agregué una instancia de Varnish a una pila de aplicaciones de Rails. El barniz en su configuración predeterminada se puede convencer desde el almacenamiento en caché de un determinado recurso utilizando el encabezado de control de caché, de esta manera:

Cache-Control: max-age=86400, public=true

Lo logré usando la declaración expires_in en mis controladores:

def index expires_in 24.hours, public: true respond_with ''some content'' end

Eso funcionó bien. Lo que no esperaba es que el encabezado Cache-Control TAMBIÉN afecte al navegador. Eso lleva al problema de que ambos: Barniz y el navegador de mis usuarios almacenan en caché un cierto recurso. El recurso se depura del barniz correctamente, pero el navegador no intenta volver a solicitarlo a menos que se alcance la edad máxima.

Entonces me pregunto si debería usar ''expires_in'' en combinación con Varnish en absoluto? Podría filtrar el encabezado Cache-Control en una instancia de Nginx o Apache frente a Varnish, pero parece extraño.

¿Alguien puede iluminarme?

Saludos Felix