Как включить кэширование фоновых изображений в ruby ​​на рельсах? - PullRequest
1 голос
/ 18 ноября 2011

Как я могу кешировать фоновые изображения (принудительно) в браузере пользователя.Было бы здорово установить время истечения 1 неделя или 1 месяц.

PS: У меня есть страница, которая показывает список на основе категории.У каждой категории есть свое фоновое изображение, и я хочу кэшировать эти фоновые изображения. Каждое изображение имеет размер около 20-30 КБ, и у меня есть около 20 категорий.

Ответы [ 3 ]

2 голосов
/ 10 июля 2012

Лак является решением, а здесь является драгоценным камнем, который может помочь вам в его реализации

Установка Для этого драгоценного камня требуется ruby ​​1.9

Basicустановка

sudo gem install lacquer  
rails generate lacquer:install

config / initializers / lacquer.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

app / controllers / application_controller.rb

class ApplicationController < ActionController::Base
  include Lacquer::CacheUtils
end

config / varnishd.yml

development:
  listen: localhost:3001
  telnet: localhost:6082
  sbin_path: /usr/local/sbin
  storage: "file,#{Rails.root}/log/varnishd.#{Rails.env}.cache,100MB"

test:
  listen: localhost:3002
  telnet: localhost:6083
  sbin_path: /usr/local/sbin
  storage: "file,#{Rails.root}/log/varnishd.#{Rails.env}.cache,100MB"

production:
  listen: :80
  telnet: localhost:6082
  sbin_path: /usr/local/sbin
  storage: "file,#{Rails.root}/log/varnishd.#{Rails.env}.cache,100MB"
  params:
    overflow_max: 2000          # for Varnish 2.x ... use "queue_max: 2000" for Varnish 3.x
    thread_pool_add_delay: 2
    thread_pools: 4             # <Number of cpu cores>
    thread_pool_min: 200        # <800/number of cpu cores>
    thread_pool_max: 4000

Если лаком необходимо кэшировать только некоторые URL-адреса приложения, Lacquer :: CacheControl будет полезен.

config / initializers / caches.rb

require "lacquer/cache_control"

Lacquer.cache_control.configure do |config|
  config.register :static,              :url => "^/images",                                           
                                        :expires_in => "365d"

  config.register :static,              :url => "^/stylesheets",
                                        :expires_in => "365d"

  config.register :static,              :url => "^/javascripts",                                       
                                        :expires_in => "365d"

  config.register :class_section,       :url => "^(/[a-z]{2})?/(info_screens|class_sections)/%s.*$",   
                                        :args => "[0-9]+", 
                                        :expires_in => "1m"

  config.register :open_scoring,        :url => "^(/[a-z]{2})?/class_sections/%s/open_scoring.*$",
                                        :args => "[0-9]+",
                                        :expires_in => "1m"

end

Inуборщик, мы можем сделать что-то вроде этого

class_section = ClassSection.find(1)
Lacquer.cache_control.purge(:open_scoring, class_section)

Это очистит «^ (/ [az] {2})? / class_sections / 1 / open_scoring. * $» (/ sv / class_sections / 1 /open_scoring.js, /sv/class_sections/1/open_scoring.html)

Файл varnish.vcl предварительно запускается при запуске varnishd с помощью задач rake

rake lacquer:varnishd:start

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);
  # }
}

Это значительно упрощает кеширование, оно настраивается только в одном месте, очищается или просто истекает.

Использование Чтобы установить пользовательский ttl для контроллера:

  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

Управление varnishd с помощью следующих задач rake

rake lacquer:varnishd:start
rake lacquer:varnishd:stop
rake lacquer:varnishd:restart
rake lacquer:varnishd:status
rake lacquer:varnishd:global_purge

Gotchas Значение TTL по умолчанию для большинства действий установлено равным 0, поскольку в большинстве случаев вы, вероятно, захотите четко указать, какие страницы кэшируются с помощью лака.Заголовок кэша по умолчанию обычно:

Cache-Control: max-age = 0, no-cache, private Это хорошо для обычных действий контроллера, так как вы не захотите их кэшировать.Если TTL для действия установлено в 0, он не будет связываться с заголовком по умолчанию.

Ключевым моментом здесь является то, что кэшированные страницы удаляют файлы cookie, поэтому, если ваше приложение использует сеансы и использует маркеры аутентификации,пользователю понадобятся файлы cookie сеанса, прежде чем будут работать действия формы.Если установить значение по умолчанию TTL равным 0, это гарантирует, что эти сеансовые куки не прервутся.

В результате все, что вам нужно сделать, чтобы установить кэшируемое действие, - это фильтр до.

1 голос
/ 18 ноября 2011

Там, где я работал, мы использовали лак для такого рода вещей.

0 голосов
/ 18 ноября 2011

Если вы используете конвейер ресурсов rails 3.1, rails уже добавляет необходимые заголовки управления кэшем для вас. Это означает, что изображения кэшируются клиентом. Rails также обеспечивает изменение имени файла после повторного развертывания, поэтому посетители не видят старые изображения, которые все еще находятся в их кэше.

Смотри также: http://guides.rubyonrails.org/asset_pipeline.html#live-compilation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...