我在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%的时间我调用我的功能:
也许十分之一,我确实得到了文件。但重点是......生成它并通过send_data发送它将是非常有用的。
我知道有关于send_file的讨论。但是,send_file需要已生成文件的文件路径。在这种情况下,我想用send_data动态创建这些数据。如果可能的话,我真的想把这个文件从send_data中推出 - 即使我的应用需要大于30秒才能生成文件。
更新
所以我的应用程序有点“超时”并且在30秒内咬住了灰尘。听起来非常像某个地方的超时设置。我想知道 - 在unicorn conf中设置send_data超时,还是在通用rails conf中设置? 如何操作与send_data相关联的超时?
答案 0 :(得分:2)
Ngnix将终止花费太长时间的连接。长连接意味着您的应用程序可能无法提供其他请求。除了重写您使用ActiveJob或其他一些后台生成的请求之外,您还可以检查nginx确认参数keepalive_timeout
。
答案 1 :(得分:0)
Unicorn有timeout parameter
将工作进程的超时设置为+秒+。工人处理 请求/ app.call /响应周期比此时间更长 期间将被强行杀死(通过SIGKILL)。这个超时是 主进程本身强制执行而不受主进程的约束 由工作进程调度限制。由于复杂性低, 低开销实现,超过3.0秒的超时可被认为是不准确和不安全的。