




摘" 要:文章介紹了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)