11

画像のアップロードを受け入れるアプリがあります。Unicorn を使用した heroku 上の rails 3 アプリです。時折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
4

1 に答える 1

4

画像のアップロード、Heroku、Unicorn など。

問題

これは、このエラーのトリフェクタです。Heroku ログに関連する H12 エラー ( https://devcenter.heroku.com/articles/error-codes#h12-request-timeout ) が記録されている可能性があります。何が起こっているかというと、リクエストが完了するまでに時間がかかりすぎているため (Heroku には避けられない 30 秒のタイムアウトがあります)、リクエストが切断され、そのユニコーン ワーカーが強制終了されました。また、Unicorn は低速/長時間のリクエストには適していません ( http://rainbows.rubyforge.orgを参照) 。

解決

トリックは、サーバー (CORS/AJAX/jquery.fileupload.js/etc) にアクセスせずにフロントエンドに画像をアップロードし、アップロードされたファイルの場所をフォームの送信と共に渡し、後でバックグラウンド ジョブとして処理を実行することです。 30 秒のタイムアウト制限の影響を受けない再アップロード。他の人はこれについてより広範囲に書いています。また、Cloudinary などのサービスを使用してこれを行うこともできます。

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
于 2014-04-01T23:05:50.107 に答える