我的情况是这样的: 1.用户上传150MB的zip文件,里面有600个文件。将文件上传到服务器需要4分钟左右。 2.服务器处理文件内容,需要70秒左右。 3.服务器响应服务不可用,其日志类似于“无法将响应转发给客户端...单击停止按钮” 4. Rails应用程序日志说,返回了200 OK响应。
所以,我猜测它必然是Nginx或Passenger中的一个问题导致它返回错误,即使它认为它在Rails应用程序内正常。我的怀疑是超时设置,因为我可以通过在长时间运行的方法中放置180秒的睡眠并且什么也不做来重现它。
如果你们知道具体的nginx / passenger配置可以修复它,我将不胜感激。
答案 0 :(得分:2)
如果你使用S3作为存储,你可以考虑使用像carrierwave_direct这样的东西来跳过通过网络服务器传递文件,而是直接上传到S3。
如上所述,您可以加入像delayed_job这样的排队过程。
答案 1 :(得分:1)
我认为nginx
是面向公众的服务器,它会将请求代理到另一台运行您的RoR应用程序的服务器。如果此假设正确,您可能需要为导致您遇到麻烦的特定位置增加nginx
proxy_read_timeout
设置的值。
答案 2 :(得分:1)
对于长期运行请求,我认为您应立即返回“请稍候”页面并制作处理背景。处理完成后,将数据库中的任务设置为“已完成”。在此期间,每当用户刷新页面时,立即返回“请稍候”。完成后,返回结果。您可以在页面中设置autorefresh超时,以便在估计的时间段后刷新页面。
答案 3 :(得分:0)
我会立即将上传内容存储到“请稍候”页面,该页面会询问后台处理的状态,甚至可以显示一些进度条,例如:使用ajax。
对于实际的后台处理,我建议使用DelayedJob,它对我们很有用,并支持轻松部署和实施。