2013-02-12 67 views
3

我成功地在Heroku上爲我的網站使用Unicorn服務器和Delayed_Job。但是我不確定它是否設置的最佳途徑,我希望得到有關如何查看工作進程的詳細信息,其中工程等。我的config/unicorn.rb文件粘貼如下:Unicorn.rb,Heroku,Delayed_Job config

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個獨角獸主進程,3個Web工作者和1個延遲工作者共5個?當我在本地以開發模式運行時,我會看到5個紅寶石pid被產生。也許最好只使用2個Web工作者,然後給2名工作人員Delayed_job(我有相當低的流量)
  • 所有這些都運行在一個Heroku dyno中,所以我不知道如何檢查狀態麒麟工人,任何想法如何?

**注意,我註釋掉了打破該網站是在生產,因爲Heroku上說,「找不到文件」

+0

此公告是有益的,但與Resque交易。我正在使用delayed_job:http://stackoverflow.com/questions/11414321/rails-heroku-unicorn-resque-how-to-choose-the-amount-of-web-workers-resq – FireDragon 2013-02-12 21:52:50

+0

你應該運行你的工作人員工人dynos,而不是你的主網頁dyno:https://devcenter.heroku.com/articles/background-jobs-queueing – catsby 2013-02-12 22:53:46

+0

@ctshryock謝謝你,我在發佈之前閱讀了這篇文章和其他許多人。不知道你是否知道,但許多人專門使用獨角獸Web服務器,以便他們可以在單個測試儀中產生多個Web /工作進程。我對使用多個測功機不感興趣,或者我會一直使用瘦服務器併購買更多網絡工作者。如果你知道如何優化獨角獸,並且特別爲heroku配置unicorn.rb,儘管我全都耳熟能詳。謝謝! – FireDragon 2013-02-13 08:53:20

回答

2

config/unicorn.rb不應該產生一個DJ工人這樣行。你應該在你Procfile指定單獨的工作進程,像這樣:

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

可以使用foreman促進地方發展的旋轉起來既獨角獸和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和後臺工作者),並且很可能會導致您在問題中出現問題(內存錯誤等) )。

+0

這是否使用單個測功機或多個dynos? – Clay 2013-03-05 15:38:12

+1

在縮放時,Procfile中定義的每個進程都將使用它自己的dyno。給定示例配置文件,web = 1 worker = 0是1個dyno運行。一個運行獨角獸的網絡測試儀本身有3個工人子女,但都包含在一個網絡過程中。 web = 2和worker = 2是4個dynos,但是有6個獨角獸工作者。 – catsby 2013-03-05 16:45:03