Unicorn.rb,Heroku,Delayed_Job配置

时间:2013-02-12 21:51:22

标签: ruby-on-rails heroku delayed-job unicorn

我在Heroku上为我的网站成功使用了Unicorn服务器和Delayed_Job。但是我不确定它是否设置为最好的方式,我想获得有关如何查看工作进程等的更多信息。我的config / unicorn.rb文件可以在下面粘贴:

worker_processes 3
preload_app true
timeout 30

# setting the below code because of the preload_app true setting above:
# http://unicorn.bogomips.org/Unicorn/Configurator.html#preload_app-method

@delayed_job_pid = nil

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
    Rails.logger.info('Disconnected from ActiveRecord')
    # start the delayed_job worker queue in Unicorn, use " -n 2 " to start 2 workers
    if Rails.env == "production"
      # @delayed_job_pid ||= spawn("RAILS_ENV=production ../script/delayed_job start")
      # @delayed_job_pid ||= spawn("RAILS_ENV=production #{Rails.root.join('script/delayed_job')} start")
      @delayed_job_pid ||= spawn("bundle exec rake jobs:work")
    elsif Rails.env == "development"
      @delayed_job_pid ||= spawn("script/delayed_job start")
      # @delayed_job_pid ||= spawn("rake jobs:work")      
    end

  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
    Rails.logger.info('Connected to ActiveRecord')
  end
end
  • delayed_job说使用RAILS_ENV=production script/delayed_job start在生产模式下启动工作进程,但如果我使用此命令,则在Heroku中会出现“找不到文件”错误。所以,现在我在生产中使用bundle exec rake jobs:work,这似乎有效,但这是正确的吗?
  • 此设置中实际运行了多少个进程,是否可以更好地进行优化?我的猜测是,有1个Unicorn主进程,3个Web工作者和1个Delayed工作者,总共5个?当我在本地运行dev模式时,我看到5个ruby pid正在生成。也许最好只使用2个Web工作人员,然后给2个工作人员使用Delayed_job(我的流量非常低)
  • 所有这些都是在一个Heroku dyno中运行的,所以我不知道如何检查Unicorn工作人员的状态,知道怎么做?

**请注意,我已经注释掉了在生产中破坏网站的行,因为Heroku说它“无法找到文件”

1 个答案:

答案 0 :(得分:2)

你的config/unicorn.rb不应该像这样产生DJ工作者。您应该在Procfile中指定一个单独的工作进程,如下所示:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker:  bundle exec rake jobs:work

您可以使用foreman进行本地开发,以启动Unicorn和DJ。您生成的config/unicorn.rb文件将更简单:

worker_processes 3
preload_app true
timeout 30

# setting the below code because of the preload_app true setting above:
# http://unicorn.bogomips.org/Unicorn/Configurator.html#preload_app-method

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
    Rails.logger.info('Disconnected from ActiveRecord')
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
    Rails.logger.info('Connected to ActiveRecord')
  end
end

正如我在评论中提到的那样,你正在产生你永远不会收获的子进程,并且可能会变成僵尸。即使您添加了代码来尝试并解释这一点,您仍然试图让单个dynos执行多个角色(Web和后台工作者),并且很可能会导致您遇到问题(内存错误,等等) )。