2013-03-06 12 views
11

Resim yüklemelerini kabul eden bir uygulama var. Unicorn kullanarak heroku üzerinde bir raylar 3 app. Zaman zaman unicorn::clientshutdown istisnalar alıyorum ve onlara neyin sebep olduğunu veya nasıl işleneceğini gerçekten bilmiyorum. Ne yapmalıyım?Heroum raylarımdaki unicorn :: clientshutdown hataları hakkında ne yapabilirim?

Bu benim unicorn.rb dosyasıdır:

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

boynuzlu at log dosyası şey ortaya çıkarmak mu yanı sıra boynuzlu at config bu eklemeliyim? –

cevap

3

resim yükleme, Heroku ve Unicorn, oh my.

Sorun

Bu, bu hata için trifecta olduğunu. Heroku kayıtlarınızda muhtemelen bir H12 hatası (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) var. Neler oluyor? İsteğin tamamlanması çok uzun sürdüğü (Heroku'nun kaçınılmaz bir 30 saniyelik zaman aşımına sahip olduğu), bu yüzden bağlantısının kesilmesi ve tek boynuzlu at işçisinin öldürüldüğü. Ayrıca, Unicorn yavaş/uzun süren istekleri ile büyük değil

Çözüm

hile (CORS/AJAX/sunucu vurmadan ön uç görüntüyü yüklemektir (http://rainbows.rubyforge.org bakınız) jquery.fileupload.js/etc), yüklenen dosya konumunu form gönderimiyle birlikte geçirerek, daha sonra herhangi bir işlemin arka plan işi ve yeniden yükleme olarak gerçekleştirilmesini sağlar, bu da 30 saniyelik zaman aşımı sınırına tabi değildir. Diğerleri bu konuda daha kapsamlı yazılar yazdılar. Ayrıca, bunu sizin için yapması için Cloudinary gibi bir hizmeti kullanabilirsiniz.

PS

YMMV, ancak (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 
İlgili konular