借助NGINX和NGINX Plus为远程学习提供视频流媒体支持

NGINX | 2020年4月16日

一年前,当F5宣布收购NGINX时,我非常激动。作为一名在F5工作多年的员工,我知道NGINX与F5非常契合。在双方最初的几次联合会议中,NGINX员工谈到了对我而言非常重要的一点:他们对“社区”的承诺。这让我更加确信自己的判断。加入NGINX团队担任产品经理后,我很高兴看到他们切实践行这一承诺,也有机会更深入地与社区合作。

新冠疫情期间,NGINX社区携手同行

从事开源工作的人通常用“社区”来指通过提交代码支持开源项目的人。虽然他们很重要,但只是NGINX社区的一小部分。那么,社区的其他成员是谁?我们同样重视以下这些人:

  • 在您通过GitHub分享的项目中使用NGINX
  • 借助NGINX向用户安全交付网站、应用和API
  • 撰写有关安装和使用NGINX的博客文章
  • 在公共论坛上帮助NGINX用户

近几个月来,NGINX社区成员齐心协力,互相支持,并帮助许多在COVID‑19疫情期间艰难维持运营的组织。许多人向我们推荐了可能受益于NGINX软件的网站,甚至投入时间并分享专业知识,帮助调整NGINX以实现理想性能。为尽一份力,我们发布了面向受COVID‑19影响的网站提供的免费资源,也很高兴看到社区积极帮助新的NGINX用户。

为帮助各组织应对流量增长并增加新功能,我们一直向抗疫一线的组织免费提供最多5个NGINX Plus实例,其中包括医疗服务机构、政府部门,以及与本博客最相关的学校、高校和专注于教育的非营利组织。我们发现,这些组织越来越多地采用一种您可能并不意外的用例:流式视频!

随着世界各地的学校停课并迅速实施远程教学,预计未来几周和几个月内,流媒体视频的使用量将呈指数级增长。在本文余下部分,我将介绍如何使用NGINX Open Source和NGINX Plus实现稳定、安全且可扩展的视频流传输。

特别感谢NGINX技术解决方案架构师James Jones为本博客录制配套演示视频!

使用NGINX Open Source进行视频直播和视频存储

我们的视频流解决方案利用了NGINX的实时消息传输协议(RTMP)模块。在本视频中,James将逐步讲解整个过程:

为了让您在观看James的演示时无需做笔记,我们已在以下各节中整理了所有命令和配置。

重要提示:切勿忽视安全!

本博客介绍的NGINX配置不包含用于限制视频流观看者的安全措施。您可以结合观看者用于观看视频的前端应用,通过多种方式保护视频流,例如仅允许从特定IP地址访问,或要求观看者进行身份验证。

安装构建工具

编译NGINX之前,需要安装一些基本的构建工具:autoconf、gcc、git和make。要下载并安装这些工具,请运行适用于所用操作系统的命令(如果此处未列出,请参阅操作系统供应商的文档)。

  • 对于Debian和Ubuntu:
$ sudo apt update$ sudo apt install build-essential git
  • 对于CentOS、Oracle Linux和RHEL:
$ sudo yum update$ sudo yum groupinstall "Development Tools"
$ sudo yum install git

安装依赖项

构建NGINX还需要多个依赖项:Perl兼容正则表达式(PCRE)、OpenSSL,以及用于压缩的zlib。

使用包管理器安装依赖项

使用包管理器可以更轻松地下载和安装依赖项。请运行适用于您所用操作系统的命令(如果此处未列出,请参阅操作系统供应商的文档)。

  • 对于Debian和Ubuntu:
$ sudo apt install libpcre3-dev libssl-dev zlib1g-dev
  • 对于CentOS、Oracle Linux和RHEL:
$ sudo yum groupinstall pcre-devel zlib-devel openssl-devel

从源代码安装依赖项

如果您希望改为从源代码构建并安装依赖项,请参阅我们的说明。

使用RTMP模块编译NGINX

要完成构建,请克隆RTMP和NGINX的GitHub代码仓库,运行NGINX的configure命令,然后编译NGINX。

$ cd /path/to/build/dir$ git clone https://github.com/arut/nginx-rtmp-module.git
$ git clone https://github.com/nginx/nginx.git
$ cd nginx
$ ./auto/configure --add-module=../nginx-rtmp-module
$ make
$ sudo make install

配置NGINX

可以配置NGINX,使用HTTP实时流(HLS)和基于HTTP的动态自适应流(DASH)协议中的一种或两种来传输视频。这两种协议提供相同的功能,因此可根据偏好进行选择。如果不熟悉这些协议,请参阅Vidbeo博客上的“HLS与DASH”。

HLS配置

HLS配置如下。在演示视频的5:10处,James解释了这些指令的用途。

rtmp {     server { 
        listen 1935; 
        application live { 
            live on; 
            interleave on;
 
            hls on; 
            hls_path /tmp/hls; 
            hls_fragment 15s; 
        } 
    } 
} 
 
http { 
    default_type application/octet-stream;
 
    server { 
        listen 80; 
        location /tv { 
            root /tmp/hls; 
        } 
    }
 
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
        text/html html;
    } 
}

DASH配置

DASH的配置如下。在演示中,James将HLS和DASH合并到同一配置中,因为这两种协议的许多指令相同。

rtmp {     server { 
        listen 1935; 
        application live { 
            live on; 
            dash on; 
            dash_path /tmp/dash; 
            dash_fragment 15s; 
        } 
    } 
} 
 
http { 
    server { 
        listen 80; 
        location /tv { 
            root /tmp/dash; 
        } 
    }
 
    types {
        text/html html;
        application/dash+xml mpd;
    } 
}

验证配置并启动NGINX

建议始终验证NGINX配置,确保不存在语法错误。运行以下命令:

$ sudo nginx -tnginx: the configuration file filename syntax is ok
nginx: configuration file filename test is successful

然后运行以下命令以启动NGINX:

$ sudo nginx

测试播放方法

启动视频流。OBS Studio是一款常用的开源工具。通过配置自定义RTMP服务器,可以使用该工具将工作站上的内容直播到NGINX服务器。将OBS的流式传输地址配置为rtmp://NGINX_server/tv/tv2,其中NGINX_server是NGINX服务器的IP地址或主机名。无需流密钥。

James在演示中没有使用OBS,因为他是从文件而非实时源传输视频。他在9:30通过运行stream.sh脚本启动视频流。该脚本的内容如下:

ffmpeg -re -I bbb_sunflower_1080p_60fps_normal.mp4 -vcodec copy -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp:192.168.1.138/live/bbb

他正在流式传输的视频(通过-I参数指定)是来自Big Buck Bunny的开源视频blender.org。有关其他参数的详细信息,请参阅ffmpeg文档。

视频开始流式传输后,可以测试NGINX是否使用已配置的协议正确提供视频。James打开了三个VLC媒体播放器实例,并访问每种播放方式对应的URL。在这些URL中,NGINX_server是其NGINX服务器的IP地址或主机名:

  • RTMP:rtmp://NGINX_server/live/bbb
  • HLS:http://NGINX_server/live/bbb.m3u8
  • DASH:http://NGINX_server/live/bbb.mpd

使用NGINX Plus改善用户体验

如果您正在构建视频库或课程,可能需要NGINX Open Source现有功能之外的能力。NGINX Plus提供扩展功能,可通过预构建模块提升性能和最终用户体验。您可以:

  • 通过缓存视频支持更大规模
  • 提供视频点播(VOD)服务
  • 通过限制带宽来管理流媒体成本和容量

在COVID‑19疫情期间,NGINX向教育、政府公共部门和非营利组织提供最多5个NGINX Plus实例的一年期免费许可证(须经审核和批准)。有关详情,请参阅“面向受COVID‑19影响的网站提供的免费资源”。

要将RTMP模块集成到NGINX Plus中,请动态加载该模块。请参阅《NGINX Plus管理指南》。

在第二个演示中,James 展示了如何使用 Ansible 和 Terraform,轻松将 NGINX Plus 设置为三台视频服务器的负载均衡器:

如需访问James在第二个演示中使用的文件,请查看他的GitHub仓库。

携手同行

如果在实施视频流或任何其他用例时遇到问题,我们随时为您提供帮助。NGINX员工和社区正在关注Stack Overflow上的NGINX频道1,并尽快回复问题和请求。

如果您所在的组织奋战在抗击疫情一线,并且有高级需求,则可能有资格获得上述NGINX Plus许可证以及更高级别的F5 DNS Load Balancer Cloud Service。有关详情,请参阅《面向受COVID‑19影响的网站提供的免费资源》。

另请查看该博客,了解如何利用NGINX和F5提供的免费资源,轻松提升网站性能。


1Stack Overflow是第三方网站,与F5, Inc.无关联。对于发布在Stack Overflow或任何其他第三方网站上的内容(包括一般信息和针对问题提出的解决方案),F5及其关联公司不承担任何责任。


分享
标签: COVID-19, F5 NGINX, Tech, 2020

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。