3

我在 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
  • delay_job 表示用于RAILS_ENV=production script/delayed_job start在生产模式下启动工作进程,但如果我使用此命令,我会在 Heroku 中收到“找不到文件”错误。所以,现在我正在bundle exec rake jobs:work生产中使用,这似乎有效,但这是正确的吗?
  • 在此设置中实际运行了多少进程,是否可以更好地优化?我的猜测是有 1 个独角兽主进程、3 个 Web 工作者和 1 个延迟作业工作者,总共 5 个?当我在本地以开发模式运行时,我看到生成了 5 个 ruby​​ pid。也许最好只使用 2 个 Web 工作者,然后将 2 个工作者分配给 Delayed_job(我的流量很低)
  • 所有这一切都在一个 Heroku dyno 中运行,所以我不知道如何检查 Unicorn 工人的状态,知道怎么做吗?

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

4

1 回答 1

3

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 和后台工作人员),并且可能会在未来给您带来问题(内存错误等。 )。

于 2013-02-13T14:36:44.310 回答