2011-11-18 15 views
7

Teniendo en cuenta que Heroku Cedar no tiene el caché de http provisto por Varnish, me gustaría usar Rack::Cache. Me han dicho que tienen carriles 3.1.1 Rack::Cache activa por defecto, que sólo tiene que asegurarse de tener en la configuración:Rails 3.1 y Http Page Caching

config.action_controller.perform_caching = true 

y tengo que escoger un almacén de caché, para este experimento estoy usando:

config.cache_store = :memory_store 

En la acción de la página que quiere almacenar he añadido las siguientes líneas:

response.header['Cache-Control'] = 'public, max-age=300' 
response.header['Expires'] = CGI.rfc1123_date(Time.now + 300) 

Este código se utiliza para funcionar bien con Varni sh, la primera solicitud devolvería un 200 y la siguiente (durante 5 minutos) devolvería un 304.

Esto no ocurre con Rails 3.1 y Heroku Cedar Stack. Obtengo esos encabezados en la respuesta pero las solicitudes posteriores devuelven 200 en lugar de 304.

¿Qué estoy haciendo mal? Gracias.

Respuesta

11

Como ha señalado, la pila de cedro no utiliza barniz. Eso significa que una solicitud web siempre llegará al servidor de ruby.

Teniendo esto en cuenta, Rack :: Cache respetará sus encabezados y servirá el contenido en caché.

Sin embargo, dado que la solicitud va más allá de la capa http en la aplicación de rieles, la respuesta siempre será 200 ya que la caché ya no ocurre en la capa http.

Para confirmar esto es cierto, inserte esto en una de sus acciones en caché:

<%= Time.now.to_i %>

A continuación, vuelva a cargar la página varias veces y se dará cuenta de la marca de tiempo no va a cambiar.

+0

¡Tienes razón! ¿Hay alguna manera de almacenar en caché en un nivel ligeramente superior? ¿Vale la pena? (por ejemplo, ¿qué ocurre si configuro un rack :: cache en config.ru antes de la aplicación Rails?) – soulnafein

+0

no realmente ... Rack :: Cache es su mejor opción. Solo ponlo es lo más alto que puedes en tu entorno y debería darte el rendimiento que necesitas, ya que evita todo el stack de http de Rails. – leonardoborges

+0

Ah, y te agradecería si pudieras votar la respuesta original si te ayudó :) – leonardoborges