Стек кедра Heroku - Заголовки кэша стойки
Я не могу понять это для моей жизни. Попытка использовать Rack::Cache для кэширования некоторых из моих статических общедоступных страниц в Heroku, в дополнение к выполнению кэширования действий в случае, если оно проходит через обратный прокси-сервер.
Например, вот код в моем "домашнем" действии:
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
Для всех намерений и целей у этого должен быть общедоступный тег контроля кэша с максимальным возрастом 10 нет?
$ 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
Я делаю что-то ужасно неправильно? Я чувствую, что с этим устаревшим, неправильным откликом кэша что-то не так... это уже четвертый раз, когда я захожу на страницу.
Информация о конфигурации:
# 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"
(Может быть, есть способ установить заголовок управления кэшем вручную? Похоже, что должен быть более простой способ).
ОБНОВИТЬ
Я даже попытался свести действие контроллера к минимуму:
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
И это не работает...
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
!
1 ответ
Может быть, переосмыслить все это и просто использовать рельсы кеширования. Новый гем cache_digests должен сделать тривиально то, что вы хотите на уровне рельсов: https://github.com/rails/cache_digests
Я готов поспорить, что это побьет ваш метод, который включает выполнение вызова файловой системы для проверки метки времени файла каждые 10 секунд.