借助 Nginx 搭建带简单认证的直播推流服务器,实现多平台同步直播
原理
使用 nginx-rtmp-module 接收 rtmp 流,然后同时推送到多个直播平台,同时使用 lua-nginx-module 来做简单的身份验证。
安装必须的 nginx 模块
debian 9 用户可以直接使用 apt 安装,需启用 stretch-backports 源:
sudo apt install libnginx-mod-rtmp libnginx-mod-http-lua -t stretch-backports
nginx 配置
Gist: nginx.conf
# file: nginx.conf
# date: 2018-10-13
# license: GPLv3 https://www.gnu.org/licenses/gpl-3.0.txt
# author: nanpuyue <[email protected]> https://blog.nanpuyue.com
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
rtmp {
server{
listen 1935;
chunk_size 10240;
application live {
live on;
record off;
on_publish http://127.0.0.1:2080/auth;
push rtmp://live.twitch.tv/app/xxxxxxxxxx;
push rtmp://a.rtmp.youtube.com/xxxxxxxxxx;
}
}
}
http {
server {
listen 127.0.0.1:2080;
location /auth {
rewrite_by_lua '
ngx.req.read_body()
local name = ngx.req.get_post_args().name
if (name == "xxxxxxxxxx") then
ngx.status = 200
ngx.say("OK")
ngx.exit(200)
else
ngx.status = 403
ngx.say("Forbidden")
ngx.exit(403)
end
';
}
}
}
注意上面有三个 xxxxxxxxxx
是需要自己替换的,push 后面的是推流地址,替换成自己的,也可以自己再添加其他平台的;最后一个 xxxxxxxxxx
是我们想 nginx 推流时要使用的“流名称”,自己生成一个就好,推荐使用 uuidgen
生成一个 UUID。
检查身份验证
启动 nginx 服务后,在服务器上执行下面的命令:
curl -0 http://127.0.0.1:2080/auth -d "name=xxxxxxxxxx"
xxxxxxxxxx
替换成前面生成的 UUID,应该输出 OK,再把 xxxxxxxxxx
换成一个错误的,应该输出 Forbidden。
推流
如果身份验证没有问题,我们就可以使用 obs 来推流了。
在 obs 设置中选择“自定义流媒体服务器”,URL 填入 rtmp://xx.xx.xx.xx/live
(xx.xx.xx.xx
是推流服务器的 ip 或域名), 流名称填入我们前面生成的 UUID。
设置好后单击 obs 上的“开始推流”,不出意外的话就可以同时向我们设置的平台推流了。
服务器带宽得大啊,
ps typecho好评
服务器带宽一般问题不大,这样做主要是省本地上传带宽。
国内这些云带宽都死贵死贵的
所以用不起国内的啊……
令人害怕
蛤蛤蛤?
我在mac os下搭建了个Nginx 流媒体服务器,把你的配置复制进去,Nginx服务就无法启动了 T_T,nginx: [emerg] unknown directive "rtmp" in /usr/local/etc/nginx/nginx.conf:16
网上搜了其他人的配置,一样的错误提示 T_T