ruby-on-rails – 使用rails,nginx和send_file在Chrome中流式传输mp4
我不能为了我的生活,使用html5< video>将mp4流式传输到Chrome标签.如果我公开放下文件,那么一切都很好,并按预期工作.但是如果我尝试使用send_file来提供服务,几乎所有可以想象的都会出错.我使用的是由nginx代理的rails应用程序,其视频模型的位置属性是磁盘上的绝对路径. 起初我尝试过:
而且我确信我会沉浸在现代网络发展的荣耀之中.哈.这可以在Chrome和Firefox中播放,但既不会寻求,也不会知道视频有多长.我在响应标头上戳了一下,发现Content-Type是作为application / octet-stream发送的,并且没有Content-Length集.嗯……好吗? 好吧,我想我可以在rails中设置它们:
在这一点上,一切都与Firefox中预期的一样.它知道视频有多长,并且寻求按预期工作. Chrome似乎知道视频的持续时间(不显示时间戳,但搜索条看起来合适),但搜索不起作用. 显然Chrome比Firefox更挑剔.它要求服务器使用带有值字节的Accept-Ranges标头进行响应,并使用206和文件的相应部分响应后续请求(在用户搜索时发生). 好吧,所以我从here借了一些代码,然后我就有了这个:
现在Chrome会尝试搜索,但是当您执行此操作时,视频会停止播放,并且在页面重新加载之前不会再次运行.哎呀.所以我决定玩弄curl来看看发生了什么,我发现了这个:
无论字节范围请求如何,数据始终从文件的开头开始.返回适当的字节数(在这种情况下为201字节),但它总是从文件的开头.显然,nginx尊重Content-Length标头但忽略了Content-Range标头. 我的nginx.conf默认是不变的:
我的app.conf非常基本:
首先,我尝试了Ubuntu 14.04附带的nginx 1.4.x,然后从ppa尝试了1.7.x – 结果相同.我甚至尝试过apache2并得到完全相同的结果. 我想重申视频文件不是问题.如果我将其公之于众,那么nginx会使用适当的mime类型,标题以及Chrome正常工作所需的一切来为其提供服务. 所以我的问题是两个部分: >为什么nginx / apache不能像send_file(X-Accel-Redirect / X-Sendfile)一样自动处理所有这些东西,就像从公共场所静态提供文件一样?在轨道中处理这些东西是如此倒退.
好吧,所以我想我会尝试将rails的复杂性从图片中删除,然后看看我是否可以让nginx正确地代理文件.所以我创建了一个简单的nodjs服务器:
而铬则是一种快乐的蛤蜊. = / curl – 我甚至显示了Accept-Ranges:bytes和Content-Type:video / mp4正在被nginx自动插入 – 应该是这样.有什么可以阻止nginx这样做?
我可能会越来越近了…… 如果我有:
然后我得到:
我有上述所有问题. 但如果我有:
然后我得到:
一切都很完美. 但为什么?那些应该做同样的事情.为什么nginx在这里没有像在简单的nodejs示例中那样自动设置Content-Type?我有config.action_dispatch.x_sendfile_header =’X-Accel-Redirect’设置.我在application.rb和development.rb之间来回移动它,结果相同.我想我从来没有提到……这是rails 4.2.0.
现在我已经将我的独角兽服务器改为侦听端口3000(因为我已经将nginx更改为在3000上侦听nodejs示例).现在我可以直接向独角兽发出请求(因为它正在侦听端口而不是套接字)所以我发现curl -I直接向unicorn显示没有发送X-Accel-Redirect标头而只是直接卷曲独角兽实际发送文件.这就像send_file没有做到它应该做的事情. 我终于得到了原始问题的答案.我不认为我会来这里.我所有的研究都导致死胡同,hacky非解决方案和“它只是开箱即用”(好吧,不适合我).
他们这样做,但必须正确配置它们以取悦Rack :: Sendfile(见下文).试图在rails中处理这个问题是一个非常糟糕的解决方案.
我非常绝望地开始讨论机架源代码,这就是我在Rack :: Sendfile的评论中找到答案的地方.它们的结构为文档,您可以在rubydoc找到它们. 无论出于何种原因,Rack :: Sendfile都需要前端代理发送X-Sendfile-Type标头.在nginx的情况下,它还需要X-Accel-Mapping头.该文档还提供了apache和lighttpd的示例. 有人会认为rails文档可以链接到Rack :: Sendfile文档,因为如果没有额外的配置,send_file就无法开箱即用.也许我会提交拉取请求. 最后我只需要在app.conf中添加几行: (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 使用带Nginx和Unicorn的Websockets的Rail
- nginx – 在使用Gunicorn运行应用程序时未注册SQLAlchemy扩
- Nginx或LVS for Node.js负载平衡?
- Linode更新-禁止使用Rails和Passenger Nginx 403
- 如何以非root用户身份运行gunicorn/python app服务器?
- nginx基于一个“位置”中的URI阻止IP
- Nginx“”try_files“指令中的参数数量无效…”用于PHP安全
- 从源安装nginx-1.7.8时,Chef :: Exceptions :: ChecksumMis
- ios – 如何解决由HTTP持久连接错误导致的超时问题?
- java – nginx:当使用nginx作为反向代理时,是否可以在访问
- python-在子目录nginx uwsgi上提供Flask应用
- apache-2.2 – nginx重定向回remote_addr IP
- 在nginx上更改标题’Django administration’文本
- 在Nginx上安装WordPress-Nginx发送install.php
- 是否可以在不安装卷的情况下将请求传递给php-fpm
- 修正Nginx源码实现worker进程隔离实现详解
- node.js-同一VPS上的PHP网站和Nodejs应用
- apache – Nginx不会离开!如何删除它
- node.js-WebSocket与“ ws://…/socket.io/”的
- python-Ngnix Gunicorn Flask:如何找出真正的基