分佈式直播系統(十一)【nginx-rtmp-module鑑權接口】

轉載請註明出處:https://blog.csdn.net/impingo
項目地址:https://github.com/im-pingo/pingos
項目官網:https://pingos.io

描述

原始nginx-rtmp-module通過修改配置可以實現在rtmp連接創建過程中觸發http回調接口,如on_play和on_publish就是分別在play請求和publish請求時觸發的事件。
原生的nginx-rtmp-module中的網絡回調事件太少,很難滿足生產環境中業務的需求。在PingOS中的nginx-rtmp-module使用了AlexWoo編寫的事件通知模塊,實現了更多的網絡消息類型。
經過本人的進一步擴展,目前PingOS中的事件通知模塊已經支持在自定義參數配置中添加變量,可以滿足絕大多數線上生產環境的業務需求。

事件回調

什麼是事件回調

事件回調通知的作用是在媒體服務器可以將實時操作通過http請求的形式反饋給你的業務服務器,以達到更精準的服務器控制的目的。
鑑權、在線統計、開播通知、動態推流、動態回源等等操作都可以通過事件回調接口來實現。

事件類型

事件 可觸發點 描述
oclp_proc start worker進程開啓時觸發,只有start階段觸發,可用於做進程監控,利用此事件刷新業務中的數據(如收到此消息就可以認爲此進程重新啓動,表明該進程上的原有客戶端連接都已經斷開)
oclp_play start, update, done play過程觸發,可用於播放鑑權和在線統計
oclp_publish start, update, done publish過程觸發,可用於推流鑑權、開播通知和在線統計
oclp_pull start, update, done 服務器收到play消息時,如果本機沒有流,則觸發該消息。該消息可用於動態拉流(動態回源)
oclp_push start, update, done 服務器收到publish消息時,則觸發該消息。該消息可用於動態轉推
oclp_stream start, update, done 服務器創建流時觸發

需要注意的是,以上所有事件默認都不觸發,需要使用者在服務器配置裏添加相應配置項才能實現。

配置選項
一條完整的事件配置包括以下配置項:

  • args:向外發送通知或控制請求時,攜帶的 http 請求參數
  • groupid:分組,主要針對 push 或 meta,多路轉推時,用於標識每路轉推用
  • stage:觸發階段,可選 start,update 和 done
  • timeout:向外發送通知或控制請求時,等待外部響應的超時時間,默認爲 3s
  • update:發送 update 通知的時間間隔,默認爲 1min,只有 stage 配置了 update 才生效

其中事件觸發點(stage)包含三個選項:

  • start:事件發生時觸發,配置或不配置 start 均爲默認開啓狀態
  • update:事件持續過程中的心跳刷新,只有start收到正常響應值(200或302)纔會試update生效
  • done:事件結束時觸發

播放鑑權

配置示例

	Syntax: oclp_play url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
	Default: -
	Context: application

注意:同一個application下不能重複配置。
配置示例:

oclp_play http://xxxx stage=start,update,done args=$pargs&clientip=$remote_addr update=20s timeout=3s;

當外部拉流時,媒體服務器向配置的 url 發送 http get 請求,請求中攜帶默認參數和擴展參數。
默認參數是不需要通過args配置就有的:

call=play&act=start&domain=$domain&app=$app&name=$name

擴展參數(配置文件中args後面所加內容):

$pargs&clientip=$remote_addr

最終發出的完整http get請求是這樣的:

GET uri?call=play&act=start&domain=$domain&app=$app&name=$name&$pargs&client=$remote_addr HTTP/1.1

配置項args

  1. 下面對默認參數進行逐一解釋:

默認參數不需要在配置文件裏出現就會被加入到 http get請求的url裏

參數 解釋
call=play 事件類型,oclp_play觸發的就是play事件,對於oclp_publish來說call=publish,以此類推
act=start 觸發點,act=start代表此時play請求剛開始。
domain=$domain 客戶端建聯時所用的host名稱,可能是ip也可能是域名,這個參數跟http請求中的host類似
app=$app play請求的application名稱
name=$name play請求的流名
  1. 下面對擴展參數(配置中args起的作用)進行逐一解釋:
參數 解釋
$pargs $ pargs 在配置文件中是個變量,意思是rtmp或http-flv或http-ts或hls+播放url中攜帶的所有參數,例如客戶端通過rtmp://ip/app/name?token=xxxxxx請求播放,那麼$pargs則會在程序運行過程中被token=xxxxxx代替。用這種方法可以將播放請求中攜帶的參數傳遞給你的業務服務器,以便業務服務器做token鑑權。
clientip=$remote_addr 同樣的,$remote_addr在配置文件中也是變量,代表遠程客戶端的IP地址。類似的變量還有非常多,具體的變量查詢請參考我的另外一篇博客“nginx-rtmp-module在配置裏使用變量

配置項stage

stage在這裏可以理解爲觸發點,每種事件(oclp_proc除外)都有三個觸發點,分別是:start、update、done。

  • start:不管有沒有顯示地在配置文件裏配置出來,默認都認爲已經配置,在play開始時的http get請求中act=start。
  • update:可選,如果配置了update,並且act=start的響應結果爲200,則服務器在play持續過程中會週期性地發送act=update的請求,可以理解爲心跳。
  • done:可選,如果配置裏done,則在play結束時,發送act=done的http get請求,可以理解爲結束通知。

http響應值

stage 響應值
start階段(act=start) 200 允許播放,非200則斷掉拉流請求
update階段(act=update) 忽略響應值
done階段(act=done) 忽略響應值

如上表所示:
對於初始請求,如果外部異常,導致pingos服務器沒有收到http返回結果,pingos將不會發送 update 請求;
如果外部回送非 200 響應,將會使用 403/NetStream.Play.Forbidden 斷掉拉流請求;
如果外部回送 200 響應並配置了刷新,會啓動 update 定時器發送刷新通知。

對於刷新通知和結束通知,不對響應做處理。

推流鑑權

Syntax: oclp_publish url [args=string] [stage=[start][,update][,done]] [timeout=time] [update=time];
	Default: -
	Context: application

一個application裏只能配置一條oclp_publish,服務器收到外部推流請求時會觸發publish事件。

oclp_publish http://xxxx stage=start,update,done args=$pargs&clientip=$remote_addr update=20s timeout=3s;

oclp_publish和oclp_play非常類似,關於各參數的解釋,以及http響應值的描述可以參考oclp_play的內容。

QQ交流羣:697773082

加我微信(cczjp1989),進微信羣

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章