一年前,当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及其关联公司不承担任何责任。
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
