在Nginx上提供高流量视频服务

4
我正在尝试向30多个客户端同时提供单个高分辨率视频。这导致瓶颈,导致一些客户端超时,一些客户端体验到相当大的延迟。
现在 - 很明显每个单独的请求都在单独处理,因此服务器正在发送许多GB / s。有人提到可能可以配置Nginx以识别所有请求均为同一资产,仅提供一次服务,然后让路由器(我们在本地运行此服务器)将文件发送到所有设备。
这可行吗?还是有其他方法可以增加我的吞吐量?
这是我每个请求的配置。到目前为止非常简单...
    upstream unicorn {
      server unix:/tmp/unicorn.todo.sock fail_timeout=0;
    }

    server {
        listen 80 default;
        root    /usr/local/var/rails/todo-after/public;

        try_files $uri/index.html $uri $uri/video @unicorn;
        location @unicorn {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://unicorn;
        }

        error_page 500 502 503 504 /500.html;
        client_max_body_size 4G;
        keepalive_timeout 10;
    }
2个回答

2
坦率地说,自己托管像这样的东西并不理想,我建议将视频托管在CDN上。他们可以更好地处理重量级带宽和协作以获得更好的延迟。

看看Amazon S3Rackspace CDN

编辑

似乎Nginx对于流媒体有一些方便的功能。您可以将单个下载的带宽限制为视频比特率的倍数。

location /video/ {
  mp4;
  mp4_limit_rate        1.2; #1.2 times the bitrate of the video.
  mp4_limit_rate_after  15s; #After downloading 15s of video.
}

问题是我们当前在本地和便携式设备上运行。我们需要在可能没有可靠的互联网访问的地方国际化运行此程序。 - msanteler
你能发布你的nginx.conf吗? - eabraham
抱歉,我的配置文件可能会稍有不同——它存储在我外部的固态硬盘上,而这个硬盘目前在办公室,所以我使用了一个旧的配置文件。我实际上没有使用 Vagrant。我已经编辑过了,以更真实地反映我最终的设置。总之,我已经确认 Nginx 正在提供视频服务,而不是 Unicorn。 - msanteler
如果客户在观看30秒后停止观看,为什么要将整个视频发送给他们呢?根据用户与视频的交互方式,有几种情况会决定最佳策略。您能否告诉我更多关于视频以及它如何被查看的背景信息? - eabraham
由于我们是在本地运行 - 并且与所有客户端在同一个房间,因此我们将坚持要求他们观看整个视频并确保在他们可以继续下一步之前拥有JS。因此,在我们这一端,非常重要的是 - 我们允许他们观看整个视频,没有中断,并且初始加载时间没有明显延迟(尽管我们肯定可以解决一些问题)。 - msanteler
显示剩余5条评论

-2

S3作为原始数据存储已经足够好了。但是直接从S3提供服务会花费很多成本。

你有两个选择:CDN(CloudFront与S3作为源)或Nginx S3代理。

第一个选项易于设置,非常高效,地理分布广泛,但不支持特定功能,如URL掩码、带有复用的HTTP2/0(也称为SPDY)、自定义缓存和自定义身份验证。

第二个选项则相反,为您提供完全自由。Nginx S3代理非常强大、便宜且经济友好,想象一下有人尝试在CDN上获取大型视频文件数千次,账单会按比例增加。对于某些项目来说,这不是问题。

所以你可以选择适合你的。

P.S. 我建议将大文件放在一个独立的机器上,具有更大的打开文件上限+利用更多的Nginx工作进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接