http://pengwei.me/nginx-rtmp-secure-your-nginx-server/
網上有解決這個問題的方法,但我在centos 和 windows上都測驗了,on_publish 引數確實起了效果,如果驗證php頁面不通過,確實是能夠阻止客戶端推流。但是如文中所說,obs客戶端推流過來的地址,如:rtmp://x.x.x.x/live/test?user=x&pass=x ,地址引數,這驗證頁面php是接受不到的 ,所以還是實作不了效果。
請問有大大實作了的么,能告知具體方法么?在線等!
uj5u.com熱心網友回復:
有人做過類似nginx-rtmp的推流權限控制么?uj5u.com熱心網友回復:
網上的都試了,不行,只好自己研究了一天,做了好多次測驗,發現了是引數獲取問題,不應該使用 _GET獲取,正確的是要用 _POST 方式:代碼如下:
在nginx 模塊組態檔中設定 on_publish
nginx.conf
rtmp {
server {
listen 1935;
ping 30s;
notify_method get;
application myapp {
live on;
on_publish http://localhost:8080/on_publish.php;
}
}
說明: http://localhost:8080/on_publish.php;
on_publish.php 要放在 能執行 php的地方就行,埠號也不一定是8080,就是你能運行php的網址和埠
然后在on_publish.php中做我們的處理。例如:
on_publish.php
<?php
// ?user=user&pass=pass
@$name = $_POST['name'];
@$pass = $_POST['pass'];
$savename= test;
$savepass = password;
if(empty($name) || empty($pass)){
echo "串碼流不正確!";
header('HTTP/1.0 404 Not Found');
}else{
if (strcmp($name, $savename) == 0 && strcmp($pass, $savepass) == 0) {
echo "串碼流正確!";
} else {
echo "串碼流不正確!";
header('HTTP/1.0 404 Not Found');
}
}
?>
此代碼簡單的作了用戶驗證,也可以改成帶資料庫驗證以及加入更多引數進行驗證。
客服端推流設定
以Open Broadcaster Software(OBS)為例
1、FMS URL:
rtmp://localhost:1935/myapp
2、播放路徑/串碼流(如果存在):
test?pass=password
其中test為streamkey串碼流的名稱,?pass=password用來驗證的 (實際使用中需要把 test 改為想要的名, password 改成 自己想要的密碼,例如設為 1234567890)
客戶端的 RTMP 設定:
rtmp://IP地址:1935/myapp/test
本人于2016-10-23 19:00 測驗測驗成功!
uj5u.com熱心網友回復:
nginx-rtmp的推流權限控制,只要控制 推流的名稱 和 控制的密匙就行了不同的流對應不同的密匙
$name 是 nginx-rtmp-module 里的 自帶引數名,不要修改
uj5u.com熱心網友回復:
大哥,請教nginx.conf應該如何寫才好呢,我的是這樣的
worker_processes 1;
#error_log logs/error.log debug;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
application test_rtmp_1 {live on;}
application hls {
live on;
hls on;
hls_path temp/hls;
hls_fragment 8s;
}
}
}
http {
server {
listen 8087;
location / {
root webroot;
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root webroot;
}
location /hls {
#server hls fragments
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias temp/hls;
expires -1;
}
}
}
但是obs推流的時候 URL:rtmp://192.168.1.151/live
密鑰流:test_rtmp_1
obs提示:

請問這樣要怎么處理一下,謝謝哈!
uj5u.com熱心網友回復:
正解http://blog.csdn.net/wei389083222/article/details/78721074uj5u.com熱心網友回復:
作業系統:windows 2003 serverweb服務器+直播系統:nginx 1.12.1 nginx-rtmp-module 1.2.0
推流設備:手機客戶端,網頁推流,obs
推流地址:rtmp://192.168.1.1:8090/live/test?pass=123
test為用戶名,123為密碼
現在的情況是live/后面不管寫什么都可以推出去,雖然也觸發了publish.php頁面,現在是不管有沒有用戶都推,也查詢了資料庫,查詢到了用戶名該怎么處理,沒有查詢到該怎么處理,不知道寫什么,下邊程式有說明
nginx.conf配置(部分):
listen 1935;
notify_method POST;
application live {
live on;
publish_notify on;
#當有設備推流時,觸發publish.php
on_publish 192.168.1.1:8090/publish.php;
}
publish.php檔案代碼:
<?php
@$name=trim($_REQUEST["name"]);
@$pass=trim($_REQUEST["pass"]);
//加了一個寫檔案操作,是為了驗證是否觸發了publish.php這個檔案,經驗證確實觸發了。
$myfile = fopen("testfile.txt", "w");
//如果都不是空值執行資料庫查詢
if(!empty($name) and !empty($pass))
{
require "function_php/function.php";
conn();//調取連接資料庫函式
//查詢資料庫中是否存在此用戶
$sql="select * from tbl_user where user_name='$name' and user_pass='$pass'";
$query=$conn->query($sql);
$row=$query->num_rows;
if ($row ==1 )
{
//如果有用戶存在把用戶名、密碼寫到檔案里,也確實寫了。現在的問題是驗證正確以后,不知道怎么寫,如何告訴nginx.conf檔案
fwrite($myfile,$name."\n");
fwrite($myfile,$pass."\n");
fwrite($myfile,$row."\n");
}
else
{
//如果用戶不存在也把用戶名和密碼寫到檔案里 驗證不正確該怎么寫呢?如何停止推流
fwrite($myfile,$name."\n");
fwrite($myfile,$pass."\n");
fwrite($myfile,$row."\n");
}
$query->free_result();
$conn->close();
}
else
{
header('HTTP/1.0 404 Not Found');
}
fclose($myfile);
?>
uj5u.com熱心網友回復:
我要想知道用戶名和密碼驗證失敗以后怎么阻止推流。uj5u.com熱心網友回復:
http_response_code(404);轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/54862.html
標籤:服務器
