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
!
¿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
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
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