Ruby on rails 如何在RubyonRails中启用背景图像的缓存?

Ruby on rails 如何在RubyonRails中启用背景图像的缓存?,ruby-on-rails,ruby-on-rails-3,image,caching,Ruby On Rails,Ruby On Rails 3,Image,Caching,如何在用户浏览器中(强制)缓存背景图像。 将有效期设为1周或1个月左右将非常好 PS:我有一个页面,显示了基于类别的列表。每个类别都有自己的背景图像,我想缓存这些背景图像。每个图像大约有20-30kb,我有大约20个类别 在我工作的地方,我们用过类似的东西。如果您使用的是rails 3.1的资产管道,rails已经为您添加了必要的缓存控制头。这意味着图像由客户端缓存。Rails还确保文件名在重新部署后发生更改,因此访问者不会看到仍在缓存中的旧图像 另请参见:是一种解决方案,是可以帮助您实现它的创

如何在用户浏览器中(强制)缓存背景图像。 将有效期设为1周或1个月左右将非常好


PS:我有一个页面,显示了基于类别的列表。每个类别都有自己的背景图像,我想缓存这些背景图像。每个图像大约有20-30kb,我有大约20个类别

在我工作的地方,我们用过类似的东西。

如果您使用的是rails 3.1的资产管道,rails已经为您添加了必要的缓存控制头。这意味着图像由客户端缓存。Rails还确保文件名在重新部署后发生更改,因此访问者不会看到仍在缓存中的旧图像

另请参见:

是一种解决方案,是可以帮助您实现它的创业板

安装 这个gem需要ruby 1.9

基本安装

sudo gem install lacquer  
rails generate lacquer:install
config/initializers/clair.rb

Lacquer.configure do |config|
  # Globally enable/disable cache
  config.enable_cache = true

  # Unless overridden in a controller or action, the default will be used
  config.default_ttl = 1.week

  # Can be :none, :delayed_job, :resque
  config.job_backend = :none

  # Array of Varnish servers to manage
  config.varnish_servers << {
    :host => "0.0.0.0", :port => 6082 # if you have authentication enabled, add :secret => "your secret"
  }

  # Number of retries
  config.retries = 5

  # config handler (optional, if you use Hoptoad or another error tracking service)
  config.command_error_handler = lambda { |s| HoptoadNotifier.notify(s) }

  ### Varnish - 2.x  /  3.x  .. VCL-Changes
  ### https://www.varnish-cache.org/docs/trunk/installation/upgrade.html

  # => Purge Command  ( "url.purge" for Varnish 2.x .. "ban.url" for Varnish 3.x )
  # => purges are now called bans in Varnish 3.x .. purge() and purge_url() are now respectively ban() and ban_url()
  config.purge_command = "ban.url"

  # => VCL_Fetch Pass Command  ( "pass" for Varnish 2.x .. "hit_for_pass" for Varnish 3.x )
  # => pass in vcl_fetch renamed to hit_for_pass in Varnish 3.x   
  config.pass_command = "pass"
end
在清扫车里,我们可以做这样的事情

class_section = ClassSection.find(1)
Lacquer.cache_control.purge(:open_scoring, class_section)
这将清除“^(/[a-z]{2}”)/class_sections/1/open_scoring.*$”(/sv/class_sections/1/open_scoring.js,/sv/class_sections/1/open_scoring.html)

当使用rake任务启动清漆时,varnish.vcl是预涂的

rake lacquer:varnishd:start
rake lacquer:varnishd:start
rake lacquer:varnishd:stop
rake lacquer:varnishd:restart
rake lacquer:varnishd:status
rake lacquer:varnishd:global_purge
config/varnish.vcl.erb

sub vcl_recv {
  # Lookup requests that we know should be cached
  if (<%= Lacquer.cache_control.to_vcl_conditions %>) {    
    # Clear cookie and authorization headers, set grace time, lookup in the cache
    unset req.http.Cookie;
    unset req.http.Authorization;
    return(lookup);
  }

  # Generates
  #
  # if(req.url ~ "^/images" || 
  #    req.url ~ "^/stylesheets" || 
  #    req.url ~ "^/javascripts" || 
  #    req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" || 
  #    req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
  #    unset req.http.Cookie;
  #    unset req.http.Authorization;
  #    return(lookup);         
  # }
}

sub vcl_fetch {
  <%= Lacquer.cache_control.to_vcl_override_ttl_urls %>

  # Generates
  #
  # if(req.url ~ "^/images" || req.url ~ "^/stylesheets" || req.url ~ "^/javascripts") {
  #   unset beresp.http.Set-Cookie;
  #   set beresp.ttl = 365d;
  #   return(deliver);
  # }
  #
  # if(req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" || 
  #   req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
  #   unset beresp.http.Set-Cookie;
  #   set beresp.ttl = 1m;
  #   return(deliver);
  # }
}
清除缓存:

class Posts < ApplicationController
  after_filter :clear_cache, :only => [ :create, :update, :destroy ]

private

  def clear_cache
    clear_cache_for(
      root_path,
      posts_path,
      post_path(@post))
  end
end
戈查斯 大多数操作的默认TTL设置为0,因为在大多数情况下,您可能希望非常明确地知道varnish缓存了哪些页面。默认缓存标头通常为:

缓存控制:最大年龄=0,无缓存,专用 这对于正常的控制器操作很好,因为您不想缓存它们。如果某个操作的TTL设置为0,则它不会与默认标头冲突

这里的关键问题是缓存页面会剥离cookie,因此如果应用程序依赖于会话并使用真实性令牌,则用户需要在表单操作开始工作之前设置会话cookie。在此处将默认TTL设置为0将确保这些会话cookie不会中断


因此,设置可缓存操作所需做的就是上面的before过滤器。

您可以按照@Tass的建议使用Varnish,或者让apache或nginx添加如下所述的头:您能帮助我快速安装/工作吗。。一旦我在ubuntu服务器上安装了debian,下一步该怎么办??
sub vcl_recv {
  # Lookup requests that we know should be cached
  if (<%= Lacquer.cache_control.to_vcl_conditions %>) {    
    # Clear cookie and authorization headers, set grace time, lookup in the cache
    unset req.http.Cookie;
    unset req.http.Authorization;
    return(lookup);
  }

  # Generates
  #
  # if(req.url ~ "^/images" || 
  #    req.url ~ "^/stylesheets" || 
  #    req.url ~ "^/javascripts" || 
  #    req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" || 
  #    req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
  #    unset req.http.Cookie;
  #    unset req.http.Authorization;
  #    return(lookup);         
  # }
}

sub vcl_fetch {
  <%= Lacquer.cache_control.to_vcl_override_ttl_urls %>

  # Generates
  #
  # if(req.url ~ "^/images" || req.url ~ "^/stylesheets" || req.url ~ "^/javascripts") {
  #   unset beresp.http.Set-Cookie;
  #   set beresp.ttl = 365d;
  #   return(deliver);
  # }
  #
  # if(req.url ~ "^(/[a-z]{2})?/(info_screens|class_sections)/[0-9]+.*$" || 
  #   req.url ~ "^(/[a-z]{2})?/class_sections/[0-9]+/open_scoring.*$") {
  #   unset beresp.http.Set-Cookie;
  #   set beresp.ttl = 1m;
  #   return(deliver);
  # }
}
  before_filter { |controller| controller.set_cache_ttl(15.minutes) }
class Posts < ApplicationController
  after_filter :clear_cache, :only => [ :create, :update, :destroy ]

private

  def clear_cache
    clear_cache_for(
      root_path,
      posts_path,
      post_path(@post))
  end
end
rake lacquer:varnishd:start
rake lacquer:varnishd:stop
rake lacquer:varnishd:restart
rake lacquer:varnishd:status
rake lacquer:varnishd:global_purge