Jac*_*Chu 19 caching ruby-on-rails ruby-on-rails-3.1 asset-pipeline cloudflare
我在我的Rails 3.1应用程序上使用CloudFlare CDN.Cloudflare是一个在DNS级别工作的CDN.在第一次打到静态资产时,CloudFlare会从您的应用程序加载它,然后将其缓存在CDN中.从CDN而不是您的应用程序加载该资产的未来请求.
我遇到的问题是,如果将控制器缓存设置为true:
config.action_controller.perform_caching = true
Run Code Online (Sandbox Code Playgroud)
它启用了Rack :: Cache中间件.由于Rails为静态资产设置了默认缓存控制设置,因此这些资产将写入Rails.cache存储.结果,我的缓存存储(在我的情况下是redis)被填充了静态资产,其中url作为哈希键.
遗憾的是,我无法关闭静态资产缓存控制标头,而不会影响Cloudflare和我的用户的浏览器如何缓存资产.我无法关闭控制器缓存或丢失页面/操作/片段缓存.如果删除Rack :: Cache中间件,结果相同.
有没有人有任何其他想法?
更新:我在这里打开了GitHub的门票.
经过大量的实验,我最终在我的config/application.rb中做了这个:
if !Rails.env.development? && !Rails.env.test?
config.middleware.insert_before Rack::Cache, Rack::Static, urls: [config.assets.prefix], root: 'public'
end
Run Code Online (Sandbox Code Playgroud)
这样做是在向Rack :: Cache请求之前添加一个Rack :: Static机架中间件.Rack :: Static中间件为根目录提供匹配前缀的URL.在这里,我将config.assets.prefix作为我的url前缀,默认为'/ assets.' 我将root设置为'public'目录.
请求此路径:
/assets/jquery-e8da439bbc8fd345e34ac57c6a216318.min.js
应该在这个文件中找到它:
公共/资产/ jQuery的e8da439bbc8fd345e34ac57c6a216318.min.js
这应该直接从public/assets目录中提供任何资产,而不是完全按Rails :: Cache,这将阻止它将资产存储在Rails cache_store中.这只有在生产中运行'rake assets:precompile'时才有效,否则'public/assets'中不会有预编译资产.
小智 7
原始海报希望防止静态资产进入常规Rails缓存,这导致他们想要禁用Rack :: Cache.而不是这样做,更好的解决方案是配置Rack :: Cache使用单独的缓存而不是一般的Rails缓存.
Rack :: Cache应针对实体存储与元存储进行不同的配置.Rack :: Cache有两个不同的存储区域:元存储和实体存储.Metastore保存有关每个缓存条目的高级信息,包括HTTP请求和响应头.该区域存储以高频率访问的小块数据.实体存储缓存响应主体内容,该内容可以是相对大量的数据,尽管它的访问频率低于元数据库.
以下配置将memcached中的Metastore信息缓存到文件系统的实际资产主体中.
使用memcached gem:
config.action_dispatch.rack_cache = {
:metastore => 'memcached://localhost:11211/meta',
:entitystore => 'file:tmp/cache/rack/body',
:allow_reload => false
}
Run Code Online (Sandbox Code Playgroud)
使用达利宝石
config.action_dispatch.rack_cache = {
:metastore => Dalli::Client.new,
:entitystore => 'file:tmp/cache/rack/body',
:allow_reload => false
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,这个配置是Heroku的推荐:https: //devcenter.heroku.com/articles/rack-cache-memcached-static-assets-rails31