2013-03-06 6 views
11

Mam aplikację, która akceptuje przesyłanie obrazów. Jest to aplikacja rails 3 na heroku za pomocą Unicorn. Od czasu do czasu dostaję wyjątki, i tak naprawdę nie wiem, co je powoduje i jak sobie z nimi radzić. Co powinienem zrobić?Co mogę zrobić w sprawie błędów jednorożca :: błędy podczas zamykania klienta w mojej aplikacji heroku?

To mój unicorn.rb pliku: dodane

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

Czy jednorożec plik dziennika odkryć coś? –

Odpowiedz

3

obrazu, Heroku i Unicorn, oh my.

Problem

To trifecta tego błędu. Prawdopodobnie istnieje błąd korelacji H12 (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) w dziennikach Heroku. To, co się dzieje, to to, że żądanie trwa zbyt długo (Heroku ma nieunikniony 30-sekundowy limit czasu), więc odłączyło się i został zabity pracownik jednorożca. Również Unicorn nie jest super z wolnych wniosków/długo działających (patrz http://rainbows.rubyforge.org)

Rozwiązanie

Sztuką jest, aby przesłać obraz na front-end bez uderzania serwer (CORS/AJAX/jquery.fileupload.js/etc), przekazując tę ​​przesłaną lokalizację pliku wraz z przesłaniem formularza, a następnie wykonując jakiekolwiek przetwarzanie później jako zadanie w tle i ponowne załadowanie, które nie podlega 30-sekundowemu limitowi limitu czasu. Inni pisali o tym szerzej. Możesz również skorzystać z usługi takiej jak Cloudinary, aby zrobić to za Ciebie.

PS

YMMV, ale należy dodać do swojej jednorożca config jak również (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 
Powiązane problemy