【问题标题】:Configuring Unicorn & Sidekiq correctly on Heroku在 Heroku 上正确配置 Unicorn 和 Sidekiq
【发布时间】:2013-03-13 03:15:37
【问题描述】:

我收到了ActiveRecord::StatementInvalid (PG::Error: SSL error: decryption failed or bad record mac 错误,所以我关注了这个guide about deploying Unicorn to Heroku,它似乎已经修复了它。但是在caveats 下,它显示了如何为这样的设置配置Resque - 我是否必须对Sidekiq 做类似的事情?

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

这是我目前设置的:

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

过程文件

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

【问题讨论】:

    标签: ruby-on-rails heroku ruby-on-rails-3.2 unicorn sidekiq


    【解决方案1】:

    从 sidekiq 2.9.0 版本开始,unicorn/passenger after_fork 无需配置。

    这里是提到问题的release notes for version 2.9.0

    这是解决分叉连接的resolved issue

    最后,comment from the maintainer 确认不再需要 after_fork 中的配置。

    【讨论】:

      【解决方案2】:

      这就是我所拥有的,并且有效:

      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
      

      注意:我在开发中使用thin,在heroku 中使用unicorn

      【讨论】:

      • 这对我有用。我将 unicorn 用于开发和生产,所以我不需要 sidekiq.rb 初始化程序,但 unicorn 初始化程序与我的几乎完全相同。
      • 我看到你已经为 Sidekiq 客户端配置了一个命名空间。这是否意味着您已经为其他地方的 Sidekiq 服务器配置了一个?
      • @steven_noble 是的。您可以在Sidekiq.configure_server 块下看到它。
      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 2014-10-02
      • 2014-04-19
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多