Nginx-rtmp推拉流鉴权模式分析与应用研究

known 发布于 2025-08-25 阅读(248)

摘" 要:文章介绍了Nginx-rtmp回调机制的基本原理和相关变量应用方法,分析Nginx-rtmp服务器推流发布和拉流播放视频流鉴权方法,根据功能需求在Nginx服务器设计三个虚拟服务器,分别提供网络访问服务、rtmp视频流发布录制控制和Nginx-rtmp推拉流的鉴权服务,使用配置文件、虚拟服务器解析PHP、查询匹配虚拟服务器数据库三种途径对推拉数据流进行鉴权,不断增加推拉流并发量,记录其推拉流并发数量和响应时间,分析其效能,根据效能设置应用场景,为Nginx-rtmp服务器推拉流鉴权提供解决方案。

关键词:Nginx服务器;虚拟服务器;推流;鉴权;效能

中图分类号:TP393;TP311.5" " 文献标识码:A" " 文章编号:2096-4706(2024)21-0057-05

Research on Analysis and Application of Push and Pull Streaming Authentication Mode of Nginx-rtmp

ZHENG Chao1, ZHANG Zhiguo2, LI Jiaheng2, JIAO Jinjin2, WANG Ziyi1

(1.Tianjin University of Traditional Chinese Medicine Library, Tianjin" 301617, China;

2.Academic Affairs Office of Tianjin University of Traditional Chinese Medicine, Tianjin" 301617, China)

Abstract: This paper describes the basic principle and the application methods of related variables of the Nginx-rtmp callback mechanism, and analyzes the authentication methods for publishing of push streaming and playing video of pull streaming on Nginx-rtmp servers. In accordance with the functional requirements, it designs three virtual servers on the Nginx server to respectively provide network access services, rtmp video streaming control of publishing and recording, and authentication services for Nginx-rtmp push and pull streaming. It authenticates the push and pull streaming through three ways of configuration files, PHP resolution of virtual server, and database queries of matched virtual server. It continuously increases the concurrent number for push and pull streaming, records their concurrent number and response time, and analyzes the performance. According to the performance, it sets application scenarios, which provides solutions for push and pull streaming authentication of Nginx-rtmp server.

Keywords: Nginx server; virtual server; push streaming; authentication; performance

0" 引" 言

Nginx服务器以高性能[1]著称,越来越广泛应用于网站建设中[2],其rtmp扩展模块可以轻松实现服务器视频媒体的点播直播服务[3-5],终端用户使用浏览器播放rtmp视频流时需要加载Adobe Flash插件,2021年以来,各大浏览器厂商停止对Adobe Flash插件的支持,替代、优化rtmp模块的方案不断涌现,其中就有Nginx-http-flv-module扩展模块[6],此模块实现http方式直播flv视频,在网页客户端配合flv.js插件[7]可以不调用Adobe Flash插件播放视频数据流,视频播放性能进一步优化。以此技术为基础的网络直播平台正蓬勃涌现,直播平台的非授权视频推流发布和拉流播放的情况也越来越多,非授权推流发布造成的直接损失无法估量,非授权的拉流播放网络视频会占用正常带宽资源,造成网络阻塞,增加网络安全隐患,对推送进入服务器的发布直播视频流和拉流播放视频流进行鉴权越来越重要。

1" Nginx全局变量和rtmp回调机制

Nginx使用全局变量来存储用户访问服务器的信息,比如访问地址、用户IP地址、端口等数据,通过对这些全局变量的判断处理可实现重定向、防盗链等操作。rtmp模块可以使用回调机制来判断处理用户数据,对用户访问做相应的处理,判断用户的合法性。用户在拉流播放或推流发布时会发送相应的命令,rtmp回调机制是在用户发送命令后挂起处理过程,等待回调处理结果,通过处理http返回的结果码,继续处理程序。推流发布、拉流播放回调是通过在on_publish和on_play后面加链接来设置,对向服务器推流发布和拉流播放视频的用户进行身份识别授权。推流发布回调流程如图1所示,拉流播放回调流程如图2所示。发向回调地址的系统变量有8个,用户可以自定义一些变量增加判断选项,在服务器中自定义变量使用$arg_变量名来获取,使用自定义变量和系统变量共同参与回调判断。回调设置方法有多种,根据不同开发环境来配置,总的来说可以分为两类,即Nginx-rtmp配置文件location中鉴权判断和外置鉴权判断,如果鉴权判断在本机的location中或者本机虚拟服务器中处理,则使用$arg_变量名来获取变量值,如果外置鉴权是个网址或者地址,使用变量名来获取其值。Nginx配置文件就是一个可编程的文件,可以使用正则匹配[8]等方法处理判断相关变量。

2" Nginx-rtmp视频流的鉴权

2.1" 推送发布rtmp视频流的鉴权方法

对推送发布rtmp视频流进入视频服务器的用户可以进行合法性鉴别,这里称为推流鉴权,由于推送用户的多样性,Nginx-rtmp配置文件location鉴权缺乏灵活性,可以设置连接来处理回调接口发送的数据,返回处理结果,此连接网页就可以使用发来的变量比对数据库相关内容对推流用户进行灵活鉴别,数据库内容可以添加删除,从而随时更新数据库内容允许授权或者合法用户推流成功。此处设计三种鉴权方式对推入Nginx-rtmp服务器视频流进行合法判断,第一种,在Nginx虚拟服务器配置文件location对推入的视频流有效性进行鉴权。这种方法鉴权的用户相对固定,如服务器会对所有推送的视频流在后台记录备份,可设置Nginx-rtmp调用FFmpeg将当前应用的视频流推送到另一个应用,在另一个应用记录备份视频流实现此功能,如图3所示,配置如下:

exec_push ffmpeg -re -i rtmp://localhost:1935/classroom1/$name?u=user1amp;amp;t=

password1 -c copy -f flv rtmp://localhost:1935/classroom1_monitor/$name?u=user2

amp;amp;t=password2;

调用FFmpeg将classroom1应用的视频数据流推送到classroom1_monitor应用中,user1是classroom1应用的播放鉴权自定义变量,user2是classroom1_monitor应用的推流发布鉴权自定义变量,在classroom1_monitor应用设置录制备份。classroom1_monitor应用的推流发布鉴权代码如下:

application classroom1_monitor {

publish_notify on;

allow publish 127.0.0.1;

deny publish all;

on_ publish http://127.0.0.1:10009/on_ publish;

}

另外两种,在一个Nginx虚拟服务器安装PHP和数据库(MySQL),在数据库存储合法推流用户信息,在连接请求中添加用户的识别信息,虚拟服务器接收网络连接传递来的鉴权变量,通过匹配存储在PHP或者数据库中的用户信息来判断用户推流的合法性,返回给回调接口判断结果信息,结果为2xx表示鉴权成功,推流入服务器的用户为合法用户,3xx表示重定向连接,4xx代表鉴权失败,配置如下:

application classroom1_monitor {

publish_notify on;

on_ publish http://127.0.0.1:10009/on_ publish.php;

}

2.2" 拉流播放rtmp视频流的鉴权方法

拉流播放和推流发布原理相同,用户在发布播放命令时挂起处理命令,等待返回http返回结果码,根据结果码继续执行命令,返回码样式同推流发布返回码。实际网络用户来源多种多样,使用Nginx-rtmp配置文件location进行鉴权播放缺乏灵活性,通常采用外置连接的方法进行鉴权,可以使用用户登录信息数据库对用户合法性进行鉴权,防止非授权用户播放视频流,占用服务器资源。拉流播放鉴权配置如下:

application classroom1 {

on_play" http://127.0.0.1:10009/on_play_mysql.php;

}

2.3" 实验环境搭建

利用多个Nginx虚拟服务器为用户提供服务,建立分布式服务器增加系统的安全性。实验环境及服务器设置:Nginx-rtmp虚拟服务器1,开启80端口提供对外访问请求服务,开启1935端口提供接收用户推送发布rtmp视频数据流,此端口也可以提供对外rtmp访问请求服务。虚拟服务器2,为增加安全,设置10008端口虚拟服务器来控制rtmp的直播、录制、停止推流、停止用户接收、信息显示等功能,对外提供访问请求服务。同理,添加只允许本地访问的10009端口虚拟服务器,作为回调接口处理发送来的用户变量,此虚拟服务器配置PHP解析服务,连接数据库,对用户进行鉴别,防火墙[9]开启1935(用户推流端口)、80(http服务端口)、10008(rtmp控制端口)来提供相应的服务。

在Vmware[10]搭建Nginx服务器,2核4 GB内存,在Nginx建立三个虚拟服务器,如图4所示,虚拟服务器根据上述内容配置相应的功能。服务器平台为CentOS 7.6,桥接到硬件网卡上,在10009端口虚拟服务器开启location本地鉴权认证、PHP和MySQL鉴权认证,逐步增加推流并发量,从日志响应时间和响应代码来分析处理效能。

$arg_app和$arg_name是Nginx服务器的系统变量,此处$arg_app是用户推流目标应用(application),$arg_name是用户推流的流名称;$arg_u和$arg_t是用户自定义变量,此处传递来的是用户名和用户密码,判断用户推流合法性,进行鉴权。代码作用:允许指定用户在应用live1-live9,推流名为home1-home9中推流成功。虚拟服务器本地location处理部分代码如下:

location /on_publish{

default_type text/html;

set $res 0;

if ( $arg_app ~ ^live[1-9]$ ){ set $res \"${res}1\";}

if ( $arg_name ~ ^home[1-9]$ ){ set $res \"${res}1\";}

if ($arg_u = \"username\"){set $res \"${res}1\";}

if ($arg_t = \"password\"){set $res \"${res}1\";}

if ($res = \"01111\"){return 200; }

if ($res != \"01111\"){return 404; }

}

在10009端口的虚拟服务器配置PHP解析服务,增加一种鉴权处理方法,回调接口获得变量格式和系统变量不一样,$_GET[app]是获得用户推流的应用名,$_GET[name] 是获得用户推流的流名称,$_GET[u]和$_GET[t]是自定义变量,用于获得用户的用户名和密码。推流判断条件作用同上,部分代码如下:

$isAuth = 1;

$number = strip_tags(htmlspecialchars($_GET[u]));

$pw = strip_tags(htmlspecialchars($_GET[t]));

$app = strip_tags(htmlspecialchars($_GET[app]));

$name = strip_tags(htmlspecialchars($_GET[name]));

if( preg_match(\"/^live[1-9]$/\",$app) amp;amp; preg_match(\"/^home[1-9]$/\",$name) amp;amp; $number== username amp;amp; $pw==passsword )

{

$isAuth = true;

}

if($isAuth){

header(\"HTTP/1.1 201 Created\");

} else{

header(\"HTTP/1.1 403 Forbidden\");

}

如果推流鉴权的应用、数据流名称、用户设置等变量相对固定可以用上面的配置方法,实际情况用户复杂多样,使用数据库存储用户信息和数据流信息,通过PHP连接数据库匹配用户信息完成鉴权。参数number是存储在数据库中用户号码,pw是存储在数据库中的用户特征信息,如密码等信息,同时匹配判断回调接口传递过来的rtmp的应用和数据流名称,代码作用:匹配白名单用户数据库中的用户,如果用户存在而且是允许推流的应用和视频流名称,则鉴权通过,部分代码如下:

$isAuth = 1;

$userNameSQL = \"select id from database where number = $ number and pw = md5($ pw) and live_number = $live_number \";

$resultSet = mysql_query($userNameSQL);

if ( mysql_num_rows($resultSet) gt; 0 amp;amp; $app==$app_num amp;amp; $name==$stream_num ) {" "$isAuth = true;

}

if($isAuth){

header(\"HTTP/1.1 202 Accepted\");

} else{

header(\"HTTP/1.1 403 Forbidden\");

}

2.4" 过程与结果

在Window10系统下使用批处理文件调用FFmpeg[11-12]发推送视频流到服务器,推送视频码率330 kbit/s,改变并发推送视频流数量,通过Nginx日志查看服务器鉴权的响应时间[13]和响应状态码,如表1所示。

响应状态码为2xx代表验证成功,三种鉴权模式均验证成功,本地Location的鉴权成功返回码为200,虚拟服务器使用PHP鉴权成功返回码为201,虚拟服务器使用PHP和MySQL数据库鉴权成功返回码为202,与代码设置吻合。本地location的鉴权方法响应时间最少,基本没有时间延迟;通过调取变量使用PHP网页进行鉴权响应时间长度稍长;数据库鉴权方式耗时最长。推流并发量也影响鉴权响应时间,响应时间随推流并发量的增加而呈线性增长。但使用数据库来验证用户信息鉴权的方法最灵活,可以设置用户前端程序,随时修改用于鉴权数据库存储的用户、密码、推流时间段、应用名称、流名称等来鉴别用户信息,虚拟机location的鉴权方式效率最高,鉴权的用户名、密码、流名称等变量相对固定可以使用这种方法。

同样方法,使用批处理文件调用FFplay拉流播放服务器视频直播流,改变拉流播放并发量,统计Nginx日志拉流播放鉴权的响应时间和响应状态码,如表2所示。

响应状态码为2xx代表验证成功,三种鉴权模式均验证成功,本地Location的鉴权方法响应耗时最少,几乎可以忽略不计,通过调取变量使用PHP进行鉴权和数据库鉴权方式耗时基本相等,这两种鉴权模式差别可以忽略,实际应用中,用户登录网站时使用cookies和session记录用户的特征信息,用户访问直播页面时在请求直播地址中添加用户的特征信息,播放鉴权时回调接口会将用户的特征信息发向回调连接,连接网页就可以接收用户的特征信息,比对数据库的用户信息,从而判断用户授权访问。

3" 结" 论

Nginx-rtmp的点播直播应用越来越广泛,可以基于这个功能开发应用平台,其推拉流鉴权的模式为后期开发增加了灵活度。调用FFmpeg参与视频流的处理时,尽量不设置对视频流的转码、压缩相关操作,会占用服务器大量资源,如果必须设置,可设立分布式物理服务器,调用FFmpeg处理此项业务。实践应用中可以把rtmp的application配置成不同的推拉流鉴权方式来分层次的限定用户访问权限,公共频道application限定推流发布用户,不限定拉流播放用户;私有频道application限定推流发布用户,限定拉流播放用户。使用前端网页随时更新推拉流用户数据库内容,增加推拉流鉴权维度,开发建设一个安全可靠、多功能的直播点播平台。

参考文献:

[1] 严恺轩.基于Nginx的高并发集群负载均衡策略的研究与优化 [D].杭州:浙江理工大学,2023.

[2] 林浩吉.新媒体直播的关键技术与应用场景 [J].电视技术,2023,47(8):162-164.

[3] 陈自强.基于自适应流媒体传输的直播系统建设 [J].信息技术与信息化,2024(2):147-150.

[4] 林旻.Nginx-rtmp-module流媒体服务器鉴权应用研究 [J].现代信息科技,2020,4(16):5-7+12.

[5] 邰非,谢周鹏,宋培龙.基于FFmpeg+Nginx技术的RTSP转RTMP架构实现 [J].数字技术与应用,2021,39(12):152-154.

[6] GitHub.Nginx-http-flv-module [EB/OL].[2024-03-11].https://github.com/winshining/Nginx-http-flv-module.

[7] GitHub.HTML5 FLV Player [EB/OL].[2024-03-13].https://github.com/bilibili/flv.js.

[8] 是静静啊.正则匹配大全 [EB/OL].[2024-03-13].https://blog.csdn.net/m0_45272038/article/details/119667140.

[9] haw2106.Linux CentOS中防火墙的关闭及开启端口 [EB/OL].[2024-03-15].https://www.cnblogs.com/haw2106/p/10730916.html.

[10] CongSec.VMware虚拟机网络模式配置详解 [EB/OL].[2024-03-15].https://blog.csdn.net/2301_80064376/article/details/140835874.

[11] GitHub.FFmpeg音视频推流及处理 [EB/OL].[2024-03-16].https://github.com/FFmpeg/FFmpeg.

[12] Cuoban.FFmpeg/avconv视频音频转码命令行工具 [EB/OL].[2024-03-16].https://blog.csdn.net/cuoban/article/details/50595483.

[13] 许海楠.计算机应用系统性能测试技术及应用分析 [J].网络安全技术与应用,2021(9):14-15.

作者简介:郑超(1978—),男,汉族,河南南阳人,实验师,硕士,研究方向:网络医学教育、流媒体传输;通信作者:张志国(1978—),男,汉族,天津人,研究员,硕士,研究方向:高等教育管理。

基金项目:天津中医药大学2023年教育教学改革研究课题(2023ZJY006)

标签:  用户 

免责声明

本文来自网络,不代表本站立场。如有不愿意被转载的情况,请联系我们。

iidomino cuppor