基于 Nginx 搭建一个 RTMP 推流服务端
填上了去年挖的坑
起因
前几天一个主播朋友因为直播需要,需要搭建一个推流服务器。
推流服务器比较常用的是 RTMP 协议,Nginx 就有这方面的模块。
刚好我这段时间在研究 Nginx,于是就答应下来帮他整一整。
解决方案
由于 Nginx 默认发行的二进制文件是不带 RTMP 推流模块的,所以这次只能跑源码编译了。
如果你的网络下载不方便,可以去 附件 获取编译所需要的文件
系统选用的是 Debian 11,内核 5.10.0-10-amd64
下载相关的源码
Nginx 的源码:http://nginx.org/en/download.html
Nginx RTMP 模块的源码:https://github.com/arut/nginx-rtmp-module/tags
PCRE 的源码:https://github.com/PhilipHazel/pcre2/releases
OpenSSL 的源码:https://github.com/openssl/openssl/tags
zlib 的源码:http://zlib.net/
下载之后,应该会有这几个文件(版本号可能不同,但总体名称应该差不多)
安装依赖
1 | apt install gcc make zip -y |
将下载后的源码文件解压,然后进入 Nginx 源码目录
开始编译
替换其中部分依赖的源码目录(就是上面下载的源码解压的目录)
1 | ./configure \ |
确认输出后的内容无误
跑一次 make
1 | make |
跑完之后就可以在 objs
目录看到输出文件了
如果是第一次安装,还可以再跑个
1 | make install |
然后,就可以在 /usr/local/nginx/sbin (configure 输出的目录)中看到 nginx 了
之后便可以正常启动 nginx 了
启动推流服务器
在 /usr/local/nginx/conf/nginx.conf 中与 http
项同级的位置插入一段(这段 Copy 自 这篇专栏)
1 | rtmp { #RTMP服务 |
然后在 http
项里插入这段,注意要把 RTMP 模块移动到 /usr/local/src/ 下
1 | location /stat { #nginx匹配stat路径查看rtmp状态。 |
修改完之后启动 Nginx
1 | /usr/local/nginx/sbin/nginx |
访问 主机IP/stat (例如 http://1.1.1.1/stat )即可看到 RTMP 模块的运行状态
踩过的坑
缺失依赖库
在 configure 的时候,遇到了三个依赖库的缺失。
起初 OpenSSL 报错的时候我以为是因为这台主机没装 OpenSSL 导致的,但我装上 OpenSSL 后还是报错,不是很清楚是什么情况,可能是某种特性(?)
源码文件留存必要
起初我以为源码文件是不能删的,实际上在编译之后源码就可以删掉了(因为没什么用了)
监测 RTMP 服务状态报错:「载入样式表单出错: 分析 XSLT 样式表单失败。」
刚开始我还以为是因为删源码导致的问题(不过确实 RTMP 的源码不能删)于是把 RTMP 的源码又下了一遍,解压到 /root/ 下
还是报错。
查了一下,才发现有可能是 /root/ 目录 Nginx 无权限访问导致的,于是把 RTMP 模块移动到 /usr/local/src/ 下,并修改了 nginx.conf,解决~
附件
附一份编译所需要的文件
nginx-1.21.5.tar.gz
nginx-rtmp-module-1.2.2.zip
openssl-openssl-3.0.1.zip
pcre2-10.39.tar.gz
zlib-1.2.11.tar.gz