send_data无法发送大文件 - 30秒后,会终止请求

时间:2017-12-01 14:43:40

标签: ruby-on-rails ruby nginx unicorn

我在nginx / unicorn上有一个使用这行代码的rails应用程序:

    format.csv { send_data Test_Model.to_csv, stream: 'true', filename: "assets-#{DateTime.now.strftime('%Y%m%d%H%M%S')}.csv" }

问题是 - 我的to_csv方法生成的文件偏大,2.4 MB - 我的应用程序通过SQL查询生成它需要很长时间 ...而且这种长度不是我可以改变的。

那么,90%的时间我调用我的功能:

what I always get

也许十分之一,我确实得到了文件。但重点是......生成它并通过send_data发送它将是非常有用的。

我知道有关于send_file的讨论。但是,send_file需要已生成文件的文件路径。在这种情况下,我想用send_data动态创建这些数据。如果可能的话,我真的想把这个文件从send_data中推出 - 即使我的应用需要大于30秒才能生成文件。

更新

所以我的应用程序有点“超时”并且在30秒内咬住了灰尘。听起来非常像某个地方的超时设置。我想知道 - 在unicorn conf中设置send_data超时,还是在通用rails conf中设置? 如何操作与send_data相关联的超时

2 个答案:

答案 0 :(得分:2)

Ngnix将终止花费太长时间的连接。长连接意味着您的应用程序可能无法提供其他请求。除了重写您使用ActiveJob或其他一些后台生成的请求之外,您还可以检查nginx确认参数keepalive_timeout

答案 1 :(得分:0)

Unicorn有timeout parameter

  

将工作进程的超时设置为+秒+。工人处理   请求/ app.call /响应周期比此时间更长   期间将被强行杀死(通过SIGKILL)。这个超时是   主进程本身强制执行而不受主进程的约束   由工作进程调度限制。由于复杂性低,   低开销实现,超过3.0秒的超时可被认为是不准确和不安全的。