2013-03-06 7 views
11

मेरे पास एक ऐप है जो छवि अपलोड स्वीकार करता है। यह यूनिकॉर्न का उपयोग करके हेरोकू पर एक रेल 3 ऐप है। मुझे कभी-कभी unicorn::clientshutdown अपवाद मिल रहे हैं, और मुझे वास्तव में पता नहीं है कि उन्हें क्या कारण है या उन्हें कैसे संभालना है। मुझे क्या करना चाहिए?मैं अपने heroku रेल ऐप पर यूनिकॉर्न :: क्लाइंटशूटडाउन त्रुटियों के बारे में क्या कर सकता हूं?

यह मेरा 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

गेंडा लॉग फ़ाइल को उजागर करता है कुछ भी जोड़ना चाहिए? –

उत्तर

3

चित्र अपलोड, Heroku, और यूनिकॉर्न, हे भगवान।

समस्या

यह इस त्रुटि के लिए trifecta है। आपके हेरोकू लॉग में शायद एक सहसंबंध H12 त्रुटि (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) है। क्या हो रहा है कि अनुरोध पूरा होने में बहुत लंबा समय लग रहा है (हेरोकू में 30 सेकंड का समय व्यर्थ है), इसलिए यह डिस्कनेक्ट हो गया और यूनिकॉर्न वर्कर मारे गए। (http://rainbows.rubyforge.org देखें) इसके अलावा, यूनिकॉर्न धीमी/लंबे समय से चल अनुरोध के साथ महान नहीं है

समाधान

चाल सर्वर से टकराने के बिना (CORS/AJAX/सामने के अंत पर छवि अपलोड करने के लिए है jquery.fileupload.js/etc), फॉर्म सबमिट करने के साथ अपलोड किए गए फ़ाइल स्थान को पास करना, फिर पृष्ठभूमि कार्य के रूप में बाद में किसी भी प्रसंस्करण को निष्पादित करना और पुनः अपलोड करना, जो 30 सेकंड टाइमआउट सीमा के अधीन नहीं है। दूसरों ने इसके बारे में अधिक व्यापक रूप से लिखा है। साथ ही, आप क्लाउडिनरी जैसी सेवा का उपयोग अपने लिए कर सकते हैं।

पुनश्च

YMMV, लेकिन आप इस अपने गेंडा config करने के साथ ही (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 
संबंधित मुद्दे