大video上传和处理超时

我正在用户上传一些video的轨道应用程序。 阿帕奇与乘客是我的服务器。 video可以大到500MB或1GB。 video上传后,它被转换为MP4并播放。

我正在使用https://github.com/valums/file-uploader上传文件。 有了这个,我可以很容易地上传一个500MB的video文件。 上传完成后,我想要显示video的mp4预览。 我使用ffmpeg处理将video转换为mp4。 此转换可能需要多达10分钟以上的时间,并且由于默认的apache超时,我的请求会在5分钟后超时。

所以,这里的问题是ajax上传保持请求活着,直到上传5分钟才完成。 我需要在file upload完成后保持活跃状态​​10-20分钟。 如果知道其他基于javascipt的解决scheme可以保持这个请求一直存在直到video处理完成并且可以向用户显示预览,那将是非常好的。

保留阻止请求直到video转码可能会给您的服务器造成负担。 大多数服务器可以同时处理40-80个并发请求,具体取决于Rails堆栈的内存占用情况,安装的gem和Apache服务器设置。 如果你允许10分钟的请求,这意味着40个同时上传的用户可以取消你的服务。

我的build议是使用Ajax轮询您的Rails服务器每隔几秒,如果工作完成转码。 如果是这样,您可以刷新页面或添加更多的JavaScript来初始化video播放。

window.setInterval( function() { $.get('video_path').done(function(data, code, xhr) { location.reload(); // or some code for playing back the video }); }, 2000); 

另一个类似的解决scheme可以使用Pusher或PubNub等第三方服务,允许浏览器保持持久连接,然后允许Rails服务器在事件触发时通知客户端。 像这些推送服务通常使用Node.Js更好的asynchronous处理和同时维护许多打开的连接。

第三个select是将Apache切换到Puma并使用Rails 新的stream媒体API 。 Puma更适合处理并发。

这听起来像一个Apacheconfiguration指令(KeepAliveTimeout和TimeOut)。

KeepAliveTimeout 1200 # 60sec * 20 min

来自Apache的更多信息和语法: http : //httpd.apache.org/docs/2.2/mod/core.html#keepalivetimeout

另一种方法:你可以修改你的JS / AJAX重新请求每2分钟,并检查预览是否存在吗?

两个tomcat参数(注意!只有在Tomcat 7.0之后才可用)允许您在运行请求时保持会话活动。 而且,只有在请求完成后,会话超时才会再次开始计数:

 org.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true org.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START=false 

你可以在server.xml中设置它们或者通过JAVA_OPTS传递它们:

 -XX:MaxPermSize=252m -Dorg.apache.catalina.session.StandardSession.ACTIVITY_CHECK=true -Dorg.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START=false