关于我的heroku rails app上的unicorn :: clientshutdown错误,我该怎么办?

时间:2013-03-06 23:13:58

标签: ruby-on-rails heroku unicorn

我有一个接受图片上传的应用。这是使用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

1 个答案:

答案 0 :(得分: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