2013-03-06 26 views
11

我有一個接受圖片上傳的應用程序。這是一款使用獨角獸的heroku上的rails 3應用程序。我偶爾會遇到異常,而且我不知道是什麼原因導致它們或如何處理這些異常。我該怎麼辦?我可以在我的heroku rails應用程序上對獨角獸:: clientshutdown錯誤做些什麼?

這是我unicorn.rb文件:

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

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis.quit 
    Rails.logger.info('Disconnected from Redis') 
    end 
end 

after_fork do |server, worker| 
    # Replace with MongoDB or whatever 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis = ENV['REDIS_URI'] 
    Rails.logger.info('Connected to Redis') 
    end 
end 
+0

是否麒麟日誌文件發現什麼了嗎? – 2014-03-07 01:15:20

回答

3

圖片上傳,Heroku的,和獨角獸,噢,我的。

問題

這是此錯誤的三連勝。 Heroku日誌中可能存在相關的H12錯誤(https://devcenter.heroku.com/articles/error-codes#h12-request-timeout)。正在發生的事情是,請求花費很長時間才能完成(Heroku有30秒的超時時間),因此它斷開連接,獨角獸工作人員死亡。此外,麒麟也不是很大慢/長期運行的請求(見http://rainbows.rubyforge.org

解決方案

的訣竅是將其上傳於前端的圖像沒有擊中服務器(CORS/AJAX/jquery.fileupload.js/etc),將上傳的文件位置與表單提交一起傳遞,然後稍後作爲後臺作業執行任何處理並重新上傳,但不受30秒超時限制的限制。其他人就此寫得更爲廣泛。此外,您可以使用像Cloudinary這樣的服務爲您做到這一點。

PS

情況因人而異,但你應該添加到您的麒麟配置以及(https://devcenter.heroku.com/articles/rails-unicorn

before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 
    # ... 
end 

after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' 
    end 
    # ... 
end 
相關問題