2013-03-23 5 views
10

Ich bekam ActiveRecord::StatementInvalid (PG::Error: SSL error: decryption failed or bad record mac Fehler, so folgte ich diesem guide about deploying Unicorn to Heroku und es scheint, es behoben zu haben. Jedoch unter caveats zeigt es, wie man Resque für solch ein Setup konfiguriert - würde ich etwas ähnliches mit Sidekiq tun müssen?Konfigurieren von Unicorn & Sidekiq korrekt auf Heroku

Beispielcode von Heroku:

before_fork do |server, worker| 

    ... 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis.quit 
    Rails.logger.info('Disconnected from Redis') 
    end 
end 

after_fork do |server, worker| 

    ... 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis = ENV['REDIS_URI'] 
    Rails.logger.info('Connected to Redis') 
    end 
end 

Dies ist, was ich zur Zeit eingerichtet haben:

config/unicorn.rb

worker_processes 2 
timeout 30 
preload_app true 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 
    defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 
    defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection 
end 

config/initializers/sidekiq.rb

require 'sidekiq' 

Sidekiq.configure_client do |config| 
    config.redis = { :size => 1 } 
end 

Sidekiq.configure_server do |config| 
    config.redis = { :size => 6 } 
end 

procfile

web: bundle exec unicorn -p $PORT -E $RACK_ENV -c ./config/unicorn.rb 
worker: bundle exec sidekiq -e production -c 4 

Antwort

6

Dies ist, was ich habe, und es funktioniert:

config/unicorn.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 5) 
timeout 15 
preload_app true 

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 

    defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection 

    Sidekiq.configure_client do |config| 
    config.redis = { size: 1, namespace: 'sidekiq' } 
    end 
end 

config/initializers/sidekiq.rb

ENV["REDIS_URL"] ||= "redis://localhost:6379" 

Sidekiq.configure_server do |config| 
    config.redis = { url: ENV["REDIS_URL"], namespace: 'sidekiq' } 
end 

unless Rails.env.production? 
    Sidekiq.configure_client do |config| 
    config.redis = { url: ENV["REDIS_URL"], namespace: 'sidekiq' } 
    end 
end 

Hinweis: Ich benutze thin auf Entwicklung und unicorn auf Heroku.

+1

Das funktioniert für mich. Ich benutze Einhorn sowohl für die Entwicklung als auch für die Produktion, daher brauche ich keinen sidekiq.rb-Initialisierer, aber der Unicorn-Initialisierer ist ziemlich genau derselbe wie meiner. –

+0

Ich sehe, dass Sie einen Namespace für den Sidekiq-Client konfiguriert haben. Bedeutet das, dass Sie einen anderen für den Sidekiq-Server konfiguriert haben? –

+0

@steven_noble ja. Sie können es unter 'Sidekiq.configure_server' Block sehen. – siong1987