我在 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 说它“找不到文件”