nginx方案

接上文 Rails动态文件添加ETag缓存 来自动生成304 Not Modified告诉客户端来直接使用本地缓存,但是在这种情况下会出现图片闪动(重新加载渲染),影响用户体验。除了Etag这种通过和服务器进行HTTP头部比对来实现缓存的策略外,还可以采用Cache-control来通知浏览器在一段时间内不必重新请求服务器而直接本地缓存。配置 nginx.conf 如下:

1 # 使用root用户来避免文件权限问题而导致403错误
2 user  root nginx;
3 
4 # 在server { } 里加入Cache-Control声明
5 location ~ ^/(assets)/  {
6   gzip_static on;
7   expires     1h;
8   add_header  Cache-Control public;
9 }

配置 config/environments/production.rb 如下:

 1 # Disable Rails's static asset server (Apache or nginx will already do this)
 2 config.serve_static_assets = false
 3 # Compress JavaScripts and CSS
 4 config.assets.compress = true
 5 # Don't fallback to assets pipeline if a precompiled asset is missed
 6 config.assets.compile = true
 7 # Generate digests for assets URLs
 8 config.assets.digest = true
 9 # 指定需要预先编译的css和js
10 config.assets.precompile += %w[js css].map {|ext| Dir[Rails.root.join("app/assets/*/*.#{ext}")] }.flatten.map {|f| f.split('/')[-1] }

每次重新部署前运行RAILS_ENV=production bundle exec rake assets:precompile 来重新生成静态资源缓存

Rack方案

https://github.com/mvj3/rack_image_assets_cache_control/