2013-03-06 54 views
11

私は画像のアップロードを許可するアプリを持っています。これは、ユニコーンを使用して英雄のレール3アプリです。私はときどきunicorn::clientshutdownの例外を取得しています。実際に何が原因か、またどのように扱うかはわかりません。私は何をすべきか?私のherokuのレールアプリでunicorn :: clientshutdownエラーについて何ができるのですか?

これは私の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の、そしてユニコーン、ああ。

問題

これは、このエラーのために三連勝単式です。 HerokuのログにはおそらくH12エラー(https://devcenter.heroku.com/articles/error-codes#h12-request-timeout)があります。何が起きているのかというと、リクエストが完了するまでに時間がかかり過ぎている(Herokuは30秒のタイムアウトを避けられない)ので、切断され、ユニコーン労働者が殺された。また、ユニコーンが遅い/長時間実行要求に素晴らしいではありません

ソリューション

トリックは(CORS/AJAX /サーバーを押すことなく、フロントエンドに画像をアップロードすることであるが(http://rainbows.rubyforge.orgを参照してください) jquery.fileupload.js/etc)にアップロードされたファイルの場所をフォーム提出と共に渡し、後でバックグラウンドジョブとして処理して再アップロードすることができます.30秒のタイムアウト限度は適用されません。他の人はこれについてもっと広範囲に書いている。また、Cloudinalのようなサービスを使ってこれを行うこともできます。

PS

YMMVが、あなたが同様にあなたのユニコーン設定にこれを追加する必要があります(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 
関連する問題