超时独角兽,轨道4.2.1

时间:2017-01-14 12:02:42

标签: ruby-on-rails

我有一个使用Unicorn作为app服务器运行的rails 4.2.1 app。  我需要为用户提供下载csv数据的能力。  我正在尝试流式传输数据,但是当文件花费的时间比Unicorn超时太长时,Unicorn会杀死这个进程

有没有办法解决这个问题  我的流代码:

private
def render_csv(data)
  set_file_headers()
  set_streaming_headers()

  response.status = 200
  self.response_body = csv_lines(data)
  Rails.logger.debug("end")
end

def set_file_headers
  file_name = "transactions.csv"
  headers["Content-Type"] = "text/csv"
  headers["Content-disposition"] = "attachment; filename=\"#{file_name}\""
end

def set_streaming_headers
  #nginx doc: Setting this to "no" will allow unbuffered responses suitable for Comet and HTTP streaming applications
  headers['X-Accel-Buffering'] = 'no'

  headers["Cache-Control"] ||= "no-cache"
  headers.delete("Content-Length")
end

def csv_lines(data)
  Enumerator.new do |y|
    #ideally you'd validate the params, skipping here for brevity
    data.find_each(batch_size: 2000) do |row|
      y << "jhjj"+ "\n"
    end
  end
end

1 个答案:

答案 0 :(得分:0)

如果使用配置文件。在那里更改超时。我就是这样做的。

在config / unicorn.rb

root = "/home/deployer/apps/appname/current"
working_directory root
pid "#{root}/tmp/pids/unicorn.pid"
stderr_path "#{root}/log/unicorn.log"
stdout_path "#{root}/log/unicorn.log"


listen "/tmp/unicorn.appname.sock"
worker_processes 2
timeout 60 #<<< if you need you can increase it.

然后你将通过

开始独角兽
bundle exec unicorn -D -E production -c config/unicorn.rb