Лак является решением, а здесь является драгоценным камнем, который может помочь вам в его реализации
Установка Для этого драгоценного камня требуется 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, это гарантирует, что эти сеансовые куки не прервутся.
В результате все, что вам нужно сделать, чтобы установить кэшируемое действие, - это фильтр до.