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