Nginx,passenger,rails - 如何配置长时间运行的请求?

时间:2011-11-22 03:02:38

标签: ruby-on-rails timeout nginx passenger

我的情况是这样的: 1.用户上传150MB的zip文件,里面有600个文件。将文件上传到服务器需要4分钟左右。 2.服务器处理文件内容,需要70秒左右。 3.服务器响应服务不可用,其日志类似于“无法将响应转发给客户端...单击停止按钮” 4. Rails应用程序日志说,返回了200 OK响应。

所以,我猜测它必然是Nginx或Passenger中的一个问题导致它返回错误,即使它认为它在Rails应用程序内正常。我的怀疑是超时设置,因为我可以通过在长时间运行的方法中放置180秒的睡眠并且什么也不做来重现它。

如果你们知道具体的nginx / passenger配置可以修复它,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果你使用S3作为存储,你可以考虑使用像carrierwave_direct这样的东西来跳过通过网络服务器传递文件,而是直接上传到S3。

如上所述,您可以加入像delayed_job这样的排队过程。

https://github.com/dwilkie/carrierwave_direct

答案 1 :(得分:1)

我认为nginx是面向公众的服务器,它会将请求代理到另一台运行您的RoR应用程序的服务器。如果此假设正确,您可能需要为导致您遇到麻烦的特定位置增加nginx proxy_read_timeout设置的值。

答案 2 :(得分:1)

对于长期运行请求,我认为您应立即返回“请稍候”页面并制作处理背景。处理完成后,将数据库中的任务设置为“已完成”。在此期间,每当用户刷新页面时,立即返回“请稍候”。完成后,返回结果。您可以在页面中设置autorefresh超时,以便在估计的时间段后刷新页面。

答案 3 :(得分:0)

我会立即将上传内容存储到“请稍候”页面,该页面会询问后台处理的状态,甚至可以显示一些进度条,例如:使用ajax。

对于实际的后台处理,我建议使用DelayedJob,它对我们很有用,并支持轻松部署和实施。