2013-03-06 9 views
11

Ho un'app che accetta i caricamenti di immagini. È un'app per rails 3 su heroku che usa Unicorn. Occasionalmente ricevo le eccezioni unicorn::clientshutdown e non so davvero cosa le causa o come gestirle. Cosa dovrei fare?Cosa posso fare su unicorn: errori di clientshutdown sulla mia app heroku rails?

Questo è il mio unicorn.rb di file: arrivi

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

Vuol il file di log unicorno scoprirai qualcosa? –

risposta

3

immagine, Heroku, e Unicorn, oh mio.

Problema

Questa è la triade per questo errore. Probabilmente c'è un errore H12 correlato (https://devcenter.heroku.com/articles/error-codes#h12-request-timeout) nei tuoi log di Heroku. Quello che sta succedendo è che la richiesta sta impiegando troppo tempo per essere completata (Heroku ha un timeout di 30 secondi ineludibile), quindi si è disconnesso e quell'operatore di unicorno è stato ucciso. Inoltre, Unicorn non è grande con le richieste/lungo in esecuzione lenta (vedi http://rainbows.rubyforge.org)

Soluzione

Il trucco è quello di caricare l'immagine sul front-end senza colpire il server (CORS/AJAX/jquery.fileupload.js/etc), passando la posizione del file caricato insieme all'invio del modulo, quindi eseguendo qualsiasi elaborazione in un secondo momento come lavoro in background e reupload, che non è soggetta al limite di timeout di 30 secondi. Altri hanno scritto più ampiamente su questo. Inoltre, potresti usare un servizio come Cloudinary per farlo per te.

PS

YMMV, ma si dovrebbe aggiungere questo alla tua configurazione unicorno così (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 
Problemi correlati