我在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
RAILS_ENV=production script/delayed_job start
在生产模式下启动工作进程,但如果我使用此命令,则在Heroku中会出现“找不到文件”错误。所以,现在我在生产中使用bundle exec rake jobs:work
,这似乎有效,但这是正确的吗?**请注意,我已经注释掉了在生产中破坏网站的行,因为Heroku说它“无法找到文件”
答案 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和后台工作者),并且很可能会导致您遇到问题(内存错误,等等) )。