2012-05-24 20 views
8

No puedo entender esto por mi vida. Estoy intentando usar Rack :: Cache para almacenar en caché algunas de mis páginas públicas estáticas en Heroku, además de hacer caché de acción en caso de que pase el proxy inverso.Heroku Cedar Stack - Rack Cache Headers

Por ejemplo, aquí está el código en mi acción "casa":

class StaticPagesController < ApplicationController 
    layout 'public' 

    caches_action :about, :contact, ......, :home, ..... 

    ...... 

    def home 
    last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml") 
    fresh_when last_modified: last_modified , public: true, etag: last_modified 
    expires_in 10.seconds, :public => true  
    end 

Para todos los efectos, esto debe tener una etiqueta de control de caché pública con 10 max-age que no?

$ curl -I http://myapp-staging.herokuapp.com/ 

HTTP/1.1 200 OK 
Cache-Control: max-age=0, private, must-revalidate 
Content-Type: text/html; charset=utf-8 
Date: Thu, 24 May 2012 06:50:45 GMT 
Etag: "997dacac05aa4c73f5a6861c9f5a9db0" 
Status: 200 OK 
Vary: Accept-Encoding 
X-Rack-Cache: stale, invalid 
X-Request-Id: 078d86423f234da1ac41b418825618c2 
X-Runtime: 0.005902 
X-Ua-Compatible: IE=Edge,chrome=1 
Connection: keep-alive 

¿Estoy haciendo algo terriblemente malo? Siento que hay algo con esa respuesta caché obsoleta e inválida ... es la cuarta vez que llego a la página.

Config Info:

# Use a different cache store in production 
config.cache_store = :dalli_store 

config.action_dispatch.rack_cache = { 
    :verbose  => true, 
    :metastore => "memcached://#{ENV['MEMCACHE_SERVERS']}", 
    :entitystore => "memcached://#{ENV['MEMCACHE_SERVERS']}"#, 
} 

# OLD : Disable Rails's static asset server (Apache or nginx will already do this) 
config.serve_static_assets = true 
config.static_cache_control = "public, max-age=2592000" 

(? Tal vez haya una manera de ajustar manualmente el encabezado de control de caché Parece que debe haber una manera más fácil sin embargo).

ACTUALIZACIÓN

Incluso he intentado tomar la acción del controlador hasta el mínimo indispensable:

def home 
    expires_in 10.seconds, :public => true 
    #last_modified = File.mtime("#{Rails.root}/app/views/static_pages/home.html.haml") 
    #fresh_when last_modified: last_modified , public: true, etag: last_modified 
end 

Y no funciona ...

HTTP/1.1 200 OK 
Server: nginx 
Date: Thu, 24 May 2012 19:15:18 GMT 
Content-Type: text/html; charset=utf-8 
Connection: keep-alive 
Status: 200 OK 
X-Ua-Compatible: IE=Edge,chrome=1 
Etag: "733798214c652f39ae79b4037e9111dc" 
Cache-Control: max-age=0, private, must-revalidate 
X-Request-Id: b33087fe0c2ae986c4cac88f14420b7c 
X-Runtime: 0.006000 
X-Rack-Cache: stale, invalid 
Vary: Accept-Encoding 
X-Varnish: 349105873 
Age: 0 
Via: 1.1 varnish 

!

+0

¿Esto es posible con caché de acción? ¿Lo has probado con caché de páginas solo para ver cómo difieren los encabezados? – KendallB

+0

hmmm Veo tu punto. Si Rack :: Cache está configurado correctamente para servir páginas (no es el método más limpio, pero lo mejor que puedes hacer en Heroku), realmente no debería haber nada allí para las acciones de almacenamiento en caché. Supongo que acabo de tener eso allí por si acaso. Trataré de sacar eso y ver qué pasa. Se pondrá en contacto contigo. – Brandon

+0

Parece que tienes razón. Cuando tomé la acción de almacenamiento en caché, los encabezados estaban configurados correctamente. Sin embargo, no sé si necesariamente entiendo esto. ¿No debería el establecimiento de encabezados de respuesta HTTP estar separados del almacenamiento en caché de los resultados de una acción? Es decir, ¿no debería ser capaz de almacenar en caché la respuesta de mi aplicación de carriles (memoria caché de acción) pero aún configurar los encabezados HTTP de manera que si un usuario vuelve a solicitar una página, no lleguen al servidor (con la configuración correcta? en el encabezado max-age?) – Brandon

Respuesta

1

Quizás repensar todo el asunto y simplemente usar el almacenamiento en caché de los rieles. La gema nuevas cache_digests debería hacer más trivial para hacer lo que quiera en el nivel de los carriles: https://github.com/rails/cache_digests

estoy dispuesto a apostar que esto batir su método que incluye hacer una llamada de sistema de archivos para comprobar el archivo de marca de tiempo cada 10 segundos.

Cuestiones relacionadas