2011-11-18 8 views
7

Dato che Heroku Cedar non ha cache HTTP fornita da Varnish, desidero utilizzare Rack::Cache. Mi è stato detto che Rails 3.1.1 hanno Rack::Cache attiva di default, ho solo bisogno di assicurarsi di avere nella configurazione:Rails 3.1 e caching pagina http

config.action_controller.perform_caching = true 

e ho bisogno di scegliere un archivio di cache, per questo esperimento sono utilizzando:

config.cache_store = :memory_store 

Nell'azione della pagina voglio mettere in cache ho aggiunto le seguenti righe:

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

Questo codice utilizzato per funzionare bene con Varni sh, la prima richiesta restituirebbe un 200 e il successivo (per 5 minuti) restituirebbe un 304.

Questo non accade con Rails 3.1 e Heroku Cedar Stack. Ricevo quelle intestazioni nella risposta, ma le richieste successive restituiscono 200 anziché 304.

Cosa sto facendo male? Grazie.

risposta

11

Come hai notato, lo stack Cedar non usa la vernice. Ciò significa che una richiesta Web colpirà sempre il server ruby.

Con questo in mente, Rack :: Cache rispetterà le intestazioni e servirà il contenuto memorizzato nella cache.

Tuttavia, poiché la richiesta sta effettivamente passando il livello http nell'app per rails, la risposta sarà sempre 200 poiché la cache non si verifica più nello strato http.

A conferma di ciò è vero, inserire questo in una delle tue azioni in cache:

<%= Time.now.to_i %>

Quindi, ricaricare la pagina più volte e si noterà il timestamp non cambierà.

+0

Hai ragione !!!! C'è un modo per memorizzare nella cache a un livello leggermente più alto? Ne vale la pena? (ad esempio, cosa succede se installo un rack :: cache in config.ru prima dell'applicazione rails?) – soulnafein

+0

non proprio ... Rack :: Cache è la soluzione migliore. Basta mettere è il più alto possibile nel vostro ambiente e dovrebbe darvi le prestazioni necessarie dato evita l'intero stack http Rails. – leonardoborges

+0

Oh e sarei grato se potessi votare la risposta originale se ti ha aiutato :) – leonardoborges