一年前,当 F5 宣布收购 NGINX时,我很激动,因为作为 F5 的长期员工,我知道 NGINX 是完美的选择。 在我们第一次联合会议上,NGINX 员工讨论了一件对我来说非常重要的事情:他们对“社区”的承诺,这证实了这种感觉。 自从以产品经理身份加入 NGINX 团队以来,我很高兴看到这一承诺付诸实践,并与社区进行了更深入的合作。
我们这些从事开源工作的人通常使用“社区”来描述通过提交代码来支持开源项目的人们。 虽然很重要,但他们只是 NGINX 社区的一小部分。 那么,社区的其他成员是谁? 我们也重视以下人员:
最近几个月,NGINX 社区的成员真正团结起来,相互支持,并支持许多在 COVID-19 疫情期间努力维持运营的组织。 你们中的许多人已经标记了可能从 NGINX 软件中受益的网站,甚至捐献了时间和专业知识来学习如何调整 NGINX 以获得最佳性能。 为了尽自己的一份力,我们发布了针对受 COVID-19 影响的网站的免费资源,并很高兴看到社区团结起来支持新的 NGINX 用户。
作为帮助组织应对增加的流量和添加新功能的努力的一部分,我们一直向处于疫情前线的组织提供多达五个免费的 NGINX Plus 实例。 其中包括医疗服务提供者、政府办公室,以及与本博客最相关的学校、大学和以教育为重点的非营利组织。 我们在这些组织中发现了一个可能不会让您感到惊讶的流行用例:流媒体视频!
随着世界各地的学校关闭并迅速实施远程学习,我们预计未来几周和几个月流媒体视频的使用量将呈指数级增长。 在本博客的其余部分,我将解释如何使用 NGINX 开源和 NGINX Plus 实现稳定、安全且可扩展的视频流。
非常感谢 NGINX 技术解决方案架构师 James Jones 录制演示视频以配合本博客!
我们的流媒体视频解决方案利用了 NGINX 的实时消息协议 (RTMP) 模块。在此视频中,James 逐步介绍了该过程:
为了让您不必在观看 James 的演示时做笔记,我们在以下部分中捕获了所有命令和配置。
本博客中介绍的 NGINX 配置不包括限制谁可以观看您的视频流的安全措施。 有多种方法可以保护观众用于观看视频的前端应用的流媒体安全,例如,只允许从特定 IP 地址访问或要求观众进行身份验证。
在编译 NGINX 之前,您需要安装一些基本的构建工具: autoconf
、 gcc
、 git
和make
。 要下载并安装它们,请运行适用于您的操作系统的命令(如果此处未包含,请查阅操作系统供应商文档)。
对于 Debian 和 Ubuntu:
$ sudo apt 更新$ sudo apt 安装 build-essential git
对于 CentOS、Oracle Linux 和 RHEL:
$ sudo yum update $ sudo yum groupinstall “开发工具” $ sudo yum install git
NGINX 构建还需要几个依赖项: Perl 兼容正则表达式 (PCRE)、OpenSSL 和 zlib 用于压缩。
下载和安装依赖项的更简单的方法是使用包管理器。 运行适合您的操作系统的命令(如果此处未包含,请查阅操作系统供应商文档)。
对于 Debian 和 Ubuntu:
$ sudo apt 安装 libpcre3-dev libssl-dev zlib1g-dev
对于 CentOS、Oracle Linux 和 RHEL:
$ sudo yum groupinstall pcre-devel zlib-devel openssl-devel
如果您想从源代码构建和安装依赖项,请参阅我们的说明。
要完成构建,您需要克隆 RTMP 和 NGINX 的 GitHub 存储库,运行 NGINX配置
命令,然后编译 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 使用 HTTP 实时流 (HLS) 和/或 HTTP 动态自适应流 (DASH) 协议来流式传输视频。 这些协议提供相同的功能,因此在它们之间进行选择实际上是一个偏好问题。 如果您不熟悉它们,请参阅 Vidbeo 博客上的HLS vs DASH 。
对于HLS,配置如下。 在演示中(时间点 5:10),詹姆斯解释了这些指令的目的。
rtmp { 服务器 {
听 1935;
应用直播 {
继续生活;
交错;
hls 开启;
hls_path /tmp/hls;
hls_片段 15秒;
}
}
}
http {
默认类型应用/八位字节流;
服务器 {
听80;
位置 /电视 {
根/tmp/hls;
}
}
类型 {
应用/vnd.apple.mpegurl m3u8;
视频/mp2t ts;
文本/html html;
}
}
对于 DASH,配置如下。 在演示中,James 将 HLS 和 DASH 结合在一个配置中,因为这两种协议的许多指令都是相同的。
rtmp { 服务器 {
听 1935;
应用直播 {
继续生活;
冲上去;
dash_path/tmp/dash;
dash_fragment 15秒;
}
}
}
http {
服务器 {
听80;
位置/电视{
根目录/tmp/dash;
}
}
类型 {
文本/html html;
应用/dash+xml mpd;
}
}
验证 NGINX 配置以确保没有语法错误始终是一个好主意。 运行此命令:
$ sudo nginx -t nginx:配置文件文件名语法正确 nginx:配置文件文件名测试成功
然后运行此命令启动 NGINX:
$ sudo nginx
开始您的视频流。 OBS Studio是一个常用的开源工具,允许您通过配置自定义 RTMP 服务器从您的工作站向您的 NGINX 服务器进行直播。 配置 OBS 以流式传输到rtmp:// NGINX_server /tv/tv2 ,其中NGINX_server是 NGINX 服务器的 IP 地址或主机名。 不需要流密钥。
詹姆斯在演示中没有使用 OBS,因为他是从文件而不是实时流式传输视频。 他通过运行stream.sh脚本启动视频流(在 9:30),该脚本包含以下内容:
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
参数指定)是来自blender.org的开源Big Buck Bunny视频。 有关其他参数的详细信息,请参阅ffmpeg
文档。
一旦视频开始流式传输,您就可以测试 NGINX 是否使用您配置的协议正确地提供视频流式传输。 James 打开了VLC 媒体播放器的三个实例,并访问每种播放方法的相应 URL。 在 URL 中, NGINX_server是其 NGINX 服务器的 IP 地址或主机名:
如果您正在构建视频库或课程,您可能需要超出 NGINX 开源所能提供的功能。 NGINX Plus包含扩展功能,可通过预构建模块来提高性能和最终用户体验。 你可以:
在 COVID-19 疫情期间,NGINX 向教育、公共政府和非营利部门的组织提供最多 5 个 NGINX Plus 实例的免费一年许可(需经审核和批准)。 有关详细信息,请参阅针对受 COVID-19 影响的网站的免费资源。
要将 RTMP 模块合并到 NGINX Plus,需要动态加载它。 请参阅NGINX Plus 管理指南。
在第二个演示中,James 展示了使用 Ansible 和 Terraform 将 NGINX Plus 轻松设置为三个视频服务器的负载均衡器:
要访问 James 在第二个演示中使用的文件,请参阅他的GitHub repo 。
如果您在实现视频流或任何其他用例时遇到困难,我们会为您提供帮助! NGINX 员工和社区正在Stack Overflow 上关注 NGINX 频道1并尽快回应问题和请求。
如果您在疫情前线的组织工作并且有高级需求,您可能有资格获得上面提到的 NGINX Plus 许可证以及更高级别的 F5 DNS 负载均衡器云服务。 有关详细信息,请参阅受 COVID-19 影响的网站的免费资源。
还可以查看该博客以了解利用 NGINX 和 F5 的免费资源轻松提高网站性能。
1Stack Overflow 是第三方网站,与 F5 无关。 公司 F5 及其附属公司对 Stack Overflow 或任何其他第三方网站上发布的内容(包括一般信息和问题的建议解决方案)不承担任何责任。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”