lacquer 0.4.0 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -20
  3. data/.travis.yml +3 -0
  4. data/Gemfile +2 -7
  5. data/README.md +260 -0
  6. data/Rakefile +11 -33
  7. data/init.rb +1 -1
  8. data/lacquer.gemspec +19 -69
  9. data/lib/generators/lacquer/install_generator.rb +5 -1
  10. data/lib/generators/lacquer/templates/initializer.rb +15 -3
  11. data/lib/generators/lacquer/templates/{varnish.sample.vcl → varnish.vcl.erb} +27 -27
  12. data/lib/generators/lacquer/templates/varnishd.yml +31 -0
  13. data/lib/lacquer/cache_control.rb +75 -0
  14. data/lib/lacquer/cache_utils.rb +14 -12
  15. data/lib/lacquer/capistrano/v2/hooks.rb +21 -0
  16. data/lib/lacquer/capistrano/v3/tasks/lacquer.rake +24 -0
  17. data/lib/lacquer/capistrano.rb +7 -0
  18. data/lib/lacquer/configuration.rb +12 -0
  19. data/lib/lacquer/delayed_job_job.rb +2 -2
  20. data/lib/lacquer/railtie.rb +9 -0
  21. data/lib/lacquer/recipes.rb +62 -0
  22. data/lib/lacquer/resque_job.rb +2 -2
  23. data/lib/lacquer/sidekiq_worker.rb +11 -0
  24. data/lib/lacquer/tasks.rb +48 -0
  25. data/lib/lacquer/varnish.rb +35 -4
  26. data/lib/lacquer/varnishd.rb +152 -0
  27. data/lib/lacquer/version.rb +3 -0
  28. data/lib/lacquer.rb +9 -0
  29. data/rails/init.rb +1 -1
  30. data/recipes/lacquer.rb +1 -0
  31. data/spec/config/generate.vcl.erb +15 -0
  32. data/spec/config/varnish.vcl +15 -0
  33. data/spec/config/varnishd.yml +12 -0
  34. data/spec/lacquer/cache_control_spec.rb +74 -0
  35. data/spec/lacquer/cache_utils_spec.rb +20 -8
  36. data/spec/lacquer/delayed_job_job_spec.rb +4 -2
  37. data/spec/lacquer/resque_job_spec.rb +4 -2
  38. data/spec/lacquer/sidekiq_worker_spec.rb +15 -0
  39. data/spec/lacquer/varnish_spec.rb +62 -18
  40. data/spec/lacquer/varnishd_spec.rb +122 -0
  41. data/spec/spec_helper.rb +13 -1
  42. data/tasks/lacquer.rake +1 -0
  43. metadata +135 -66
  44. data/.bundle/config +0 -2
  45. data/Gemfile.lock +0 -39
  46. data/README.rdoc +0 -83
  47. data/VERSION +0 -1
@@ -0,0 +1,75 @@
1
+ module Lacquer
2
+ def self.cache_control
3
+ @cache_control ||= CacheControl.new
4
+ end
5
+
6
+ class CacheControl
7
+ include Lacquer::CacheUtils
8
+ attr_accessor :store
9
+
10
+ def initialize
11
+ self.store = []
12
+ end
13
+
14
+ def register(group, options = {})
15
+ options[:group] = group
16
+ options[:args] = Array(options[:args]).compact
17
+ store << options
18
+ end
19
+
20
+ def configure
21
+ yield self
22
+ end
23
+
24
+ def purge(group, *args)
25
+ clear_cache_for(*urls_for(group, *args))
26
+ end
27
+
28
+ def urls_for(group, *args)
29
+ args.map! { |arg| arg.to_param }
30
+ urls_by(group).map { |options| options[:url] % args }
31
+ end
32
+
33
+ def to_vcl_conditions(urls = store)
34
+ urls.map { |opt| %Q[req.url ~ "#{(opt[:url] % opt[:args])}"] }.join(" || ")
35
+ end
36
+
37
+ def to_vcl_override_ttl_urls
38
+ urls_grouped_by_expires.map do |expires_in, list|
39
+ <<-CODE.gsub(/^[ \t]{4}*/, '')
40
+ if(#{to_vcl_conditions(list)}) {
41
+ unset beresp.http.Set-Cookie;
42
+ set beresp.ttl = #{expires_in};
43
+ return(deliver);
44
+ }
45
+ CODE
46
+ end.join("\n")
47
+ end
48
+
49
+ def to_vcl_pass_urls
50
+ <<-CODE.gsub(/^[ \t]{4}*/, '')
51
+ if(#{to_vcl_conditions(urls_by(:pass))}) {
52
+ return(pass);
53
+ }
54
+ CODE
55
+ end
56
+
57
+ def to_vcl_pipe_urls
58
+ <<-CODE.gsub(/^[ \t]{4}*/, '')
59
+ if(#{to_vcl_conditions(urls_by(:pipe))}) {
60
+ return(pipe);
61
+ }
62
+ CODE
63
+ end
64
+
65
+ protected
66
+
67
+ def urls_grouped_by_expires
68
+ store.group_by { |opt| opt[:expires_in] }.select { |expires_in, list| expires_in }
69
+ end
70
+
71
+ def urls_by(group)
72
+ store.select { |opt| opt[:group] == group }
73
+ end
74
+ end
75
+ end
@@ -26,20 +26,22 @@ module Lacquer
26
26
  #
27
27
  # clear_cache_for(root_path, blog_posts_path, '/other/content/*')
28
28
  def clear_cache_for(*paths)
29
- paths.each do |path|
30
- case Lacquer.configuration.job_backend
31
- when :delayed_job
32
- require 'lacquer/delayed_job_job'
33
- Delayed::Job.enqueue(Lacquer::DelayedJobJob.new(path))
34
- when :resque
35
- require 'lacquer/resque_job'
36
- Resque.enqueue(Lacquer::ResqueJob, path)
37
- when :none
38
- Varnish.new.purge(path)
39
- end
29
+ return unless Lacquer.configuration.enable_cache
30
+ case Lacquer.configuration.job_backend
31
+ when :delayed_job
32
+ require 'lacquer/delayed_job_job'
33
+ Delayed::Job.enqueue(Lacquer::DelayedJobJob.new(paths))
34
+ when :resque
35
+ require 'lacquer/resque_job'
36
+ Resque.enqueue(Lacquer::ResqueJob, paths)
37
+ when :sidekiq
38
+ require 'lacquer/sidekiq_worker'
39
+ Lacquer::SidekiqWorker.perform_async(paths)
40
+ when :none
41
+ Varnish.new.purge(*paths)
40
42
  end
41
43
  end
42
-
44
+
43
45
  # Sends cache control headers with page.
44
46
  # These are the headers that varnish responds to
45
47
  # to set cache properly.
@@ -0,0 +1,21 @@
1
+ # Capistrano tasks for Lacquer
2
+
3
+ Capistrano::Configuration.instance(:must_exit).load do
4
+ _cset(:lacquer_roles) { :web }
5
+
6
+ after "deploy:web:disable", "lacquer:global_purge"
7
+ after "deploy:web:enable", "lacquer:global_purge"
8
+ after "deploy:rollback", "lacquer:global_purge"
9
+ after "deploy:rollback", "lacquer:restart"
10
+ after "deploy:update", "lacquer:restart"
11
+
12
+ namespace :lacquer do
13
+ %w( start stop restart global_purge status ).each do |name|
14
+ desc "#{name} varnish"
15
+ task name.to_sym, :roles => lacquer_roles do
16
+ next if find_servers_for_task(current_task).empty?
17
+ run "cd #{current_path} && #{rake} lacquer:varnishd:#{name}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ namespace :load do
2
+ task :defaults do
3
+ set :lacquer_roles, -> { :web }
4
+ end
5
+ end
6
+
7
+ namespace :lacquer do
8
+ %w( start stop restart purge global_purge status ).each do |name|
9
+ desc "#{name} varnish"
10
+ task name.to_sym do
11
+ on roles(fetch(:lacquer_roles)) do
12
+ within release_path do
13
+ with rails_env: fetch(:rails_env) do
14
+ execute :bundle, "exec rake", "lacquer:varnishd:#{name}"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ after "deploy:rollback", "lacquer:global_purge"
22
+ after "deploy:rollback", "lacquer:restart"
23
+ after "deploy:updated", "lacquer:restart"
24
+ end
@@ -0,0 +1,7 @@
1
+ require 'capistrano/version'
2
+
3
+ if defined?(Capistrano::VERSION) && Gem::Version.new(Capistrano::VERSION).release >= Gem::Version.new('3.0.0')
4
+ load File.expand_path("../capistrano/v3/tasks/lacquer.rake", __FILE__)
5
+ else
6
+ require 'lacquer/capistrano/v2/hooks'
7
+ end
@@ -20,6 +20,15 @@ module Lacquer
20
20
  # Error handler
21
21
  attr_accessor :command_error_handler
22
22
 
23
+ # Purge Command
24
+ attr_accessor :purge_command
25
+
26
+ # Pass Command (in vcl_fetch)
27
+ attr_accessor :pass_command
28
+
29
+ # Use sudo for start up
30
+ attr_accessor :use_sudo
31
+
23
32
  def initialize
24
33
  @enable_cache = true
25
34
  @varnish_servers = []
@@ -27,6 +36,9 @@ module Lacquer
27
36
  @job_backend = :none
28
37
  @retries = 5
29
38
  @command_error_handler = nil
39
+ @purge_command = "url.purge"
40
+ @pass_command = "pass"
41
+ @use_sudo = false
30
42
  end
31
43
 
32
44
  # Returns a hash of all configurable options
@@ -1,7 +1,7 @@
1
1
  module Lacquer
2
- class DelayedJobJob < Struct.new(:url)
2
+ class DelayedJobJob < Struct.new(:urls)
3
3
  def perform
4
- Varnish.new.purge(url)
4
+ Varnish.new.purge(*urls)
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,9 @@
1
+ require 'lacquer'
2
+ require 'rails'
3
+ module Lacquer
4
+ class Railtie < Rails::Railtie
5
+ rake_tasks do
6
+ load 'lacquer/tasks.rb'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,62 @@
1
+ # Capistrano Recipes for managing varnishd
2
+ #
3
+ # Add these callbacks to have the varnishd process restart when the server
4
+ # is restarted:
5
+ #
6
+ # after "deploy:stop", "delayed_job:stop"
7
+ # after "deploy:start", "delayed_job:start"
8
+ # after "deploy:restart", "delayed_job:restart"
9
+ #
10
+ # If you've got varnishd running on a servers, you can also specify
11
+ # which servers have varnishd running and should be restarted after deploy.
12
+ #
13
+ # set :varnishd_role, :varnish
14
+ #
15
+
16
+ Capistrano::Configuration.instance.load do
17
+ namespace :varnishd do
18
+ def rails_env
19
+ fetch(:rails_env, false) ? "RAILS_ENV=#{fetch(:rails_env)}" : ''
20
+ end
21
+
22
+ def rake
23
+ fetch(:rake, 'rake')
24
+ end
25
+
26
+ def roles
27
+ fetch(:varnishd_role, :varnish)
28
+ end
29
+
30
+ desc "Link varnishd.yml from shared/config to app/config"
31
+ task :link_varnishd_yml, :roles => lambda { roles } do
32
+ run "cd #{release_path} && ln -nfs #{shared_path}/config/varnishd.yml #{release_path}/config/varnishd.yml"
33
+ end
34
+ after 'deploy:update_code', 'varnishd:link_varnishd_yml'
35
+
36
+ desc "Link varnish.vcl from shared/config to app/config"
37
+ task :link_varnish_vcl, :roles => lambda { roles } do
38
+ run "cd #{release_path} && ln -nfs #{shared_path}/config/varnish.vcl #{release_path}/config/varnish.vcl"
39
+ end
40
+ after 'deploy:update_code', 'varnishd:link_varnishd_vcl'
41
+
42
+ desc "Purge ALL urls from Varnish"
43
+ task :global_purge, :roles => lambda { roles } do
44
+ run "cd #{current_path};#{rails_env} #{rake} varnishd:global_purge"
45
+ end
46
+
47
+ desc "Stop the varnishd process"
48
+ task :stop, :roles => lambda { roles } do
49
+ run "cd #{current_path};#{rails_env} #{rake} varnishd:stop"
50
+ end
51
+
52
+ desc "Start the varnishd process"
53
+ task :start, :roles => lambda { roles } do
54
+ run "cd #{current_path};#{rails_env} #{rake} varnishd:start"
55
+ end
56
+
57
+ desc "Restart the delayed_job process"
58
+ task :restart, :roles => lambda { roles } do
59
+ run "cd #{current_path};#{rails_env} #{rake} varnishd:restart"
60
+ end
61
+ end
62
+ end
@@ -2,8 +2,8 @@ module Lacquer
2
2
  class ResqueJob
3
3
  @queue = :lacquer
4
4
 
5
- def self.perform(url)
6
- Varnish.new.purge(url)
5
+ def self.perform(urls)
6
+ Varnish.new.purge(*urls)
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,11 @@
1
+ module Lacquer
2
+ class SidekiqWorker
3
+ include Sidekiq::Worker
4
+
5
+ sidekiq_options queue: :lacquer
6
+
7
+ def perform(urls)
8
+ Varnish.new.purge(*urls)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,48 @@
1
+ namespace :lacquer do
2
+ namespace :varnishd do
3
+ desc "Start varnishd daemon using Lacquer's settings"
4
+ task :start => :environment do
5
+ Lacquer::Varnishd.new.start
6
+ end
7
+
8
+ desc "Stop varnishd daemon using Lacquer's settings"
9
+ task :stop => :environment do
10
+ Lacquer::Varnishd.new.stop
11
+ end
12
+
13
+ desc "Running status of varnishd daemon using Lacquer's settings"
14
+ task :status => :environment do
15
+ if Lacquer::Varnishd.new.running?
16
+ puts "Varnishd is running"
17
+ else
18
+ puts "Varnishd is not running"
19
+ end
20
+ end
21
+
22
+ desc "Restart varnishd daemon using Lacquer's settings"
23
+ task :restart => :environment do
24
+ varnishd = Lacquer::Varnishd.new
25
+ if varnishd.running?
26
+ varnishd.stop
27
+ sleep(1)
28
+ end
29
+ varnishd.start
30
+ end
31
+
32
+ desc "Reload VCL configuration through varnishadm with Lacquer's settings"
33
+ task :reload => :environment do
34
+ varnishd = Lacquer::Varnishd.new
35
+ varnishd.reload
36
+ end
37
+
38
+ desc "Purge a urls from Varnish"
39
+ task :purge => :environment do
40
+ Lacquer::Varnish.new.purge(ENV['PURGE'].to_s)
41
+ end
42
+
43
+ desc "Purge ALL urls from Varnish"
44
+ task :global_purge => :environment do
45
+ Lacquer::Varnish.new.purge('.*')
46
+ end
47
+ end
48
+ end
@@ -12,9 +12,14 @@ module Lacquer
12
12
  end
13
13
 
14
14
  # Sends the command 'url.purge *path*'
15
- def purge(path)
16
- send_command('url.purge ' << path).all? do |result|
17
- result =~ /200/
15
+ def purge(*paths)
16
+ paths.all? do |path|
17
+ ActiveSupport::Notifications.instrument('purge.lacquer', path: path) do |payload|
18
+ send_command(Lacquer.configuration.purge_command + " " + path.gsub('\\', '\\\\\\')).all? do |result|
19
+ payload[:result] = result
20
+ result =~ /200/
21
+ end
22
+ end
18
23
  end
19
24
  end
20
25
 
@@ -29,8 +34,32 @@ module Lacquer
29
34
  'Host' => server[:host],
30
35
  'Port' => server[:port],
31
36
  'Timeout' => server[:timeout] || 5)
37
+
38
+ if(server[:secret])
39
+ connection.waitfor("Match" => /^107/) do |authentication_request|
40
+ matchdata = /^107 \d{2}\s*(.{32}).*$/m.match(authentication_request) # Might be a bit ugly regex, but it works great!
41
+ salt = matchdata[1]
42
+ if(salt.empty?)
43
+ raise VarnishError, "Bad authentication request"
44
+ end
45
+
46
+ digest = OpenSSL::Digest.new('sha256')
47
+ digest << salt
48
+ digest << "\n"
49
+ digest << server[:secret]
50
+ digest << salt
51
+ digest << "\n"
52
+
53
+ connection.cmd("String" => "auth #{digest.to_s}", "Match" => /\d{3}/) do |auth_response|
54
+ if(!(/^200/ =~ auth_response))
55
+ raise AuthenticationError, "Could not authenticate"
56
+ end
57
+ end
58
+ end
59
+ end
60
+
32
61
  connection.cmd('String' => command, 'Match' => /\n\n/) {|r| response = r.split("\n").first.strip}
33
- connection.close
62
+ connection.close if connection.respond_to?(:close)
34
63
  rescue Exception => e
35
64
  if retries < Lacquer.configuration.retries
36
65
  retry
@@ -41,6 +70,8 @@ module Lacquer
41
70
  :error_message => "Error while trying to connect to #{server[:host]}:#{server[:port]}: #{e}",
42
71
  :parameters => server,
43
72
  :response => response })
73
+ elsif e.kind_of?(Lacquer::AuthenticationError)
74
+ raise e
44
75
  else
45
76
  raise VarnishError.new("Error while trying to connect to #{server[:host]}:#{server[:port]} #{e}")
46
77
  end
@@ -0,0 +1,152 @@
1
+ module Lacquer
2
+ class Varnishd
3
+ attr_accessor :listen, :telnet, :sbin_path, :bin_path, :storage, :working_dir, :user, :backend, :params, :use_sudo, :pid_path
4
+
5
+ cattr_accessor :started_check_delay, :vcl_script_filename
6
+ self.started_check_delay = 1
7
+ self.vcl_script_filename = 'config/varnish.vcl'
8
+
9
+ def self.root_path
10
+ Rails.root
11
+ end
12
+
13
+ def self.env
14
+ Rails.env
15
+ end
16
+
17
+ def self.config_file
18
+ root_path.join('config/varnishd.yml')
19
+ end
20
+
21
+ def self.config
22
+ YAML.load(File.read(config_file))[env].stringify_keys
23
+ end
24
+
25
+ def initialize(settings = self.class.config)
26
+ self.listen, self.telnet, self.backend, self.sbin_path, self.bin_path, self.storage, self.working_dir, self.user, self.params, self.use_sudo, self.pid_path =
27
+ settings.values_at("listen", "telnet", "backend", "sbin_path", "bin_path", "storage", "working_dir", "user", "params", "use_sudo", "pid_path")
28
+ end
29
+
30
+ def render_vcl
31
+ require 'erubis'
32
+ eruby = Erubis::Eruby.new(erb_vcl_script_filename.read)
33
+ eruby.result(binding)
34
+ end
35
+
36
+ def generate_vcl
37
+ if erb_vcl_script_filename.exist?
38
+ log "#{erb_vcl_script_filename} found rendering to #{vcl_script_filename}"
39
+ File.open(vcl_script_filename, "w") do |vcl|
40
+ vcl.write(render_vcl)
41
+ end
42
+ end
43
+ end
44
+
45
+ def start
46
+ if running?
47
+ log("Already running")
48
+ return
49
+ end
50
+ generate_vcl
51
+ execute("#{varnishd_cmd} #{args} #{params_args}")
52
+ sleep(self.class.started_check_delay)
53
+ log("Failed to start varnishd daemon") unless running?
54
+ end
55
+
56
+ def stop
57
+ if running?
58
+ execute("#{'sudo ' if use_sudo}kill #{pid}")
59
+ pid_file.delete
60
+ else
61
+ log("pid file not found or varnishd not running")
62
+ end
63
+ end
64
+
65
+ def reload
66
+ if running?
67
+ generate_vcl
68
+ reload_id = "reload#{Time.now.usec}"
69
+ load_cmd = "#{varnishadm_cmd} vcl.load #{reload_id} #{options['-f']}"
70
+ use_cmd = "#{varnishadm_cmd} vcl.use #{reload_id}"
71
+ execute "#{load_cmd} && #{use_cmd}"
72
+ else
73
+ start
74
+ end
75
+ end
76
+
77
+ def running?
78
+ !!pid && !!execute("ps p #{pid}").include?(pid.to_s) # works with sudo
79
+ end
80
+
81
+ def args
82
+ options.map { |k, v| "#{k} #{v}" }.join(" ")
83
+ end
84
+
85
+ def params_args
86
+ params.map { |k, v| "-p #{k}=#{v}" }.join(" ")
87
+ end
88
+
89
+ def options
90
+ opt = {}
91
+ opt["-P"] = pid_file
92
+ opt["-a"] = listen
93
+ opt["-T"] = telnet if telnet.present?
94
+ opt["-n"] = working_dir if working_dir.present?
95
+ opt["-u"] = user if user.present?
96
+ opt["-s"] = eval(%Q("#{storage}"))
97
+ opt["-f"] = vcl_script_filename
98
+ opt
99
+ end
100
+
101
+ def params
102
+ @params || {}
103
+ end
104
+
105
+ protected
106
+
107
+ def varnishd_cmd
108
+ "#{'sudo ' if use_sudo}#{Pathname.new(sbin_path).join('varnishd')}"
109
+ end
110
+
111
+ def varnishadm_cmd
112
+ "#{'sudo ' if use_sudo}#{Pathname.new(bin_path).join('varnishadm')} -T #{options['-T']}"
113
+ end
114
+
115
+ def pid_file
116
+ pid_computed_path.join("varnishd.#{self.class.env}.pid")
117
+ end
118
+
119
+ def pid_computed_path
120
+ if self.pid_path
121
+ Pathname.new self.pid_path
122
+ else
123
+ self.class.root_path.join('log/')
124
+ end
125
+ end
126
+
127
+ def vcl_script_filename
128
+ self.class.root_path.join(self.class.vcl_script_filename)
129
+ end
130
+
131
+ def erb_vcl_script_filename
132
+ vcl_script_filename.sub_ext('.vcl.erb')
133
+ end
134
+
135
+ def log(message)
136
+ puts "** [#{self.class.name}] #{message}"
137
+ end
138
+
139
+ def execute(cmd)
140
+ log(cmd)
141
+ `#{cmd}`
142
+ end
143
+
144
+ def pid
145
+ if pid_file.exist?
146
+ pid_file.read
147
+ else
148
+ nil
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,3 @@
1
+ module Lacquer
2
+ VERSION = '0.6.6'
3
+ end
data/lib/lacquer.rb CHANGED
@@ -1,13 +1,22 @@
1
1
  require "rubygems"
2
2
  require "net/telnet"
3
+
4
+ require "openssl"
5
+ require "digest/sha2"
6
+
3
7
  require "active_support/core_ext"
4
8
 
5
9
  require "lacquer/configuration"
6
10
  require "lacquer/cache_utils"
11
+ require "lacquer/cache_control"
7
12
  require "lacquer/varnish"
13
+ require "lacquer/varnishd"
14
+
15
+ require "lacquer/railtie" if defined?(Rails::Railtie)
8
16
 
9
17
  module Lacquer
10
18
  class VarnishError < Exception; end # @private
19
+ class AuthenticationError < VarnishError; end # @private
11
20
 
12
21
  class << self
13
22
  attr_accessor :configuration
data/rails/init.rb CHANGED
@@ -1 +1 @@
1
- require 'lacquer'
1
+ require 'lacquer'
@@ -0,0 +1 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'lacquer', 'recipes'))
@@ -0,0 +1,15 @@
1
+ backend default {
2
+ .host = "<%= backend.split(':').first %>";
3
+ .port = "<%= backend.split(':').last %>";
4
+ }
5
+
6
+ sub vcl_recv {
7
+ set req.backend = default;
8
+ unset req.http.Cookie;
9
+ set req.grace = 30m;
10
+ }
11
+
12
+ sub vcl_fetch {
13
+ unset beresp.http.Set-Cookie;
14
+ set beresp.grace = 30m;
15
+ }
@@ -0,0 +1,15 @@
1
+ backend default {
2
+ .host = "127.0.0.1";
3
+ .port = "3000";
4
+ }
5
+
6
+ sub vcl_recv {
7
+ set req.backend = default;
8
+ unset req.http.Cookie;
9
+ set req.grace = 30m;
10
+ }
11
+
12
+ sub vcl_fetch {
13
+ unset beresp.http.Set-Cookie;
14
+ set beresp.grace = 30m;
15
+ }
@@ -0,0 +1,12 @@
1
+ test:
2
+ listen: :80
3
+ telnet: localhost:6082
4
+ sbin_path: /usr/local/sbin
5
+ bin_path: /usr/local/bin
6
+ backend: 0.0.0.0:3000
7
+ storage: "file,#{Rails.root}/log/varnish,1GB"
8
+ working_dir: ""
9
+ user: "deploy"
10
+ use_sudo: true
11
+ params:
12
+ overflow_max: 2000