在Heroku上正确配置Unicorn和Sidekiq

10

我遇到了ActiveRecord::StatementInvalid (PG::Error: SSL error: decryption failed or bad record mac错误,所以我按照这个在Heroku上部署Unicorn的指南操作,似乎已经解决了问题。然而,在注意事项中,它展示了如何为这样的设置配置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
2个回答

17

从sidekiq 2.9.0版本开始,在unicorn/passenger的after_fork中不需要进行任何配置。

以下是2.9.0版本的发布说明,其中提到了该问题。

这是一个已解决的问题,解决了fork连接问题的resolved issue

最后,这里有一篇维护者的评论,确认在after_fork中不再需要配置。


6
这是我拥有的并且有效的内容:

配置/独角兽.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

1
这对我很有效。我在开发和生产中都使用独角兽,所以我不需要一个sidekiq.rb初始化程序,但独角兽初始化程序几乎与我的完全相同。 - Jaco Pretorius
我看到你已经为Sidekiq客户端配置了一个命名空间。这是否意味着你在其他地方也为Sidekiq服务器配置了一个命名空间? - steven_noble
@steven_noble 是的。你可以在 Sidekiq.configure_server 块下看到它。 - siong1987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接