2013-03-06 4 views
11

Ich habe eine App, die Bilduploads akzeptiert. Es ist eine Rails 3 App auf Heroku mit Unicorn. Ich bekomme gelegentlich unicorn::clientshutdown Ausnahmen, und ich weiß nicht wirklich, was sie verursacht oder wie man damit umgeht. Was soll ich machen?Was kann ich gegen Unicorn :: clientshutdown Fehler in meiner Heroku Rails App tun?

Das ist mein unicorn.rb Datei:

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

Hat das Einhorn Protokolldatei alles aufdecken? –

Antwort

3

Bild-Uploads, Heroku und Unicorn, oh mein.

Problem

Dies ist die Trifecta für diesen Fehler. Es gibt wahrscheinlich einen korrelierenden H12-Fehler (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) in Ihren Heroku-Protokollen. Was passiert, ist, dass die Anfrage zu lange dauert (Heroku hat eine unausweichliche 30-sekündige Zeitüberschreitung), also wurde die Verbindung getrennt und der Einhorn-Arbeiter getötet. Auch Einhorn ist nicht groß mit langsam/lang laufenden Anfragen (siehe http://rainbows.rubyforge.org)

Lösung

Der Trick ist, das Bild auf dem Front-End zu laden, ohne auf den Server (CORS/AJAX/jquery.fileupload.js/etc), übergibt den hochgeladenen Dateispeicherort zusammen mit der Formularübergabe und führt dann später jede Verarbeitung als Hintergrundjob und erneutes Hochladen durch, was nicht dem 30-Sekunden-Zeitlimit unterliegt. Andere haben ausführlich darüber geschrieben. Sie können auch einen Dienst wie Cloudinary verwenden, um dies für Sie zu tun.

PS

YMMV, aber Sie sollten diese zu Ihrem Einhorn Config als auch hinzufügen (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 
Verwandte Themen