obs+nginx-http-flv-module部署方案v1.0
linux安装 nginx 1.26.0安装过程
1、文件下载
方式1、官网下载安装包
http://nginx.org/download/nginx-1.26.0.tar.gz
方式2、使用命令下载
wget https://nginx.org/download/nginx-1.26.0.tar.gz
2、文件解压
tar -zxvf nginx-1.18.0.tar.gz
3、文件安装
3.1、执行编译命令
http://ip:8080/live?port=1935&app=myapp&stream=mystream
进入解压后nginx-1.26.0目录执行nginx编译命令
chmod +x ./configure
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module --with-pcre --with-http_realip_module --with-http_gzip_static_module
命令是用于配置 Nginx Web 服务器的编译选项。这个命令包含了多个选项,每个选项都用于启用 Nginx 的特定功能或模块。下面是每个选项的含义:
./configure: 这是配置脚本的调用,用于设置编译参数。
--prefix=/usr/local/nginx: 指定安装 Nginx 的前缀目录,这里是 /usr/local/nginx。
--with-http_ssl_module: 启用 SSL 模块,允许 Nginx 使用 HTTPS 协议。
--with-http_v2_module: 启用 HTTP/2 模块,支持 HTTP/2 协议。
--with-http_stub_status_module: 启用 HTTP 状态模块,允许访问 Nginx 的状态信息。
--with-pcre: 启用 PCRE 库支持,用于正则表达式匹配。
--with-http_realip_module: 启用 RealIP 模块,用于获取客户端的真实 IP 地址。
--with-http_gzip_static_module: 启用静态文件的 Gzip 压缩模块,用于压缩静态文件以减少传输数据量。
这个命令通常在从源代码编译 Nginx 时使用,确保编译出的 Nginx 包含了所需的模块和功能。在使用此命令之前,请确保您已经安装了所有必要的依赖项,并且已经下载了 Nginx 的源代码
3.2、执行进行安装命令
make && make install
4、验证版本
cd /usr/local/nginx/sbin
./nginx -v
5、修改配置
cd /usr/local/nginx/conf
此目录下的nginx.conf 即是配置文件,对此调整或者覆盖即可。
6、常用相关指令
启动 ./nginx
停止 ./nginx -s stop
重读配置文件 ./nginx -s reload
(不建议使用,存在重启配置无效或者端口被占用不写错误日志无法发现)
测试配置文件是否修改正确 ./nginx -t
nginx异常状况
异常一、error: C compiler cc is not found
在3.1、执行编译命令时报错,代表系统无法找到 C 编译器。这通常意味着没有安装 C 编译器
checking for OS
- Linux 5.15.0-41-generic x86_64
checking for C compiler ... not found
./configure: error: C compiler cc is not found
1、安装 PCRE 库及其开发文件,这对于编译和运行依赖 PCRE 的软件(如 Nginx)是必需的。不同之处在于它们分别用于不同的 Linux 发行版和使用不同的包管理器
centos:yum -y install pcre*
ubuntu:sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
2、检查ggc版本命令: gcc --version ;若无法找到,则执行以下指令进行安装
centos:yum -y install gcc gcc-c++ kernel-devel
ubuntu:sudo apt-get install gcc
异常二、error: SSL modules require the OpenSSL library.
在3.1、执行编译命令时报错,在编译支持 SSL 功能的软件(如 Nginx)时,需要 OpenSSL 库。SSL(安全套接层)是一种安全协议,用于在互联网上加密数据传输,而 OpenSSL 是一个开源的实现 SSL 和 TLS 协议的库。
要解决这个问题,你需要确保 OpenSSL 库已经安装在你的系统上。以下是安装 OpenSSL 库的步骤:
Ubuntu,使用以下命令安装 OpenSSL 库:
sudo apt-get update
sudo apt-get install libssl-dev
CentOS,使用以下命令安装 OpenSSL 库:sudo yum -y install openssl-devel
异常三、the HTTP gzip module requires the zlib library.
安装 zlib 库:如果你希望启用 gzip 模块,你需要安装 zlib 库。对于基于 Debian 的系统,使用以下命令:
sudo apt-get update
sudo apt-get install zlib1g-dev
对于基于 Red Hat 的系统,使用以下命令:
sudo yum -y install zlib-devel
异常四: objs/Makefile:868: objs/src/event/ngx_event_openssl.o
3.2、执行进行安装命令时,出现以下报错内容
all warnings being treated as errors
make[1]: *** [objs/Makefile:868: objs/src/event/ngx_event_openssl.o] Error 1
此问题为nginx版本不兼容openssl3系列版本,虽然可以通过一些方式降低版本来兼容,但更推荐升级到nginx1.25以上的版本(我升级了nginx-1.26.0版本)。重新编译安装即可
nginx-1.26.0地址:
https://nginx.org/download/nginx-1.26.0.tar.gz
Nginx安装nginx-rtmp-module模块
简介
nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展。
nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最终生成一个名为nginx的可执行文件。
流程
查看当前nginx 的版本(假设安装位置为:/usr/local/nginx)
下载当前版本的源代码
下载 nginx-rtmp-module模块源代码
重新编译nginx并追加nginx-rtmp-module
将新编译好的 nginx 可执行文件拷贝到当前nginx安装目录(/usr/local/nginx/sbin)
步骤
查看当前已经安装的nginx版本
[root@bogon sbin]# ./nginx -V
nginx version: nginx/1.26.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module
V:小v仅打印版本号,大V既打印版本号,也打印扩展信息,这里要使用大V
拿到版本号的目的是待会要下载该版本的源代码
注意保存打印内容中的 arguments 后面的内容,后面编译会用到
下载对应版本的nginx源代码
找一个目录,假设为 /home/cml
本文即 1.26.0
wget http://nginx.org/download/nginx-1.26.0.tar.gz
tar -zxvf nginx-1.26.0.tar.gz
下载nginx-rtmp-module模块源代码
进入到 /home/cml
git clone https://github.com/arut/nginx-rtmp-module.git
重新编译nginx
此时,/home/cml 目录下面有两个目录
nginx-1.26.0
nginx-rtmp-module
进入 nginx-1.18.0 目录,可以看到有一个 configure 可执行文件
chmod +x ./configure
./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --add-module=/home/cml/nginx-rtmp-module
使用configure 配置编译环境
将上面 保存的“arguments 后面的内容”作为configure 的第一个参数
第二个参数为 --add-module=/home/cml/nginx-rtmp-module ,即添加一个模块,模块源代码位置是 /home/cml/nginx-rtmp-module
如果没有出错,执行 编译命令
make
编译成功后,在/home/cml/nginx-1.26.0/objs 中会有一个 名为nginx的可执行文件,这个就是编译好的了, 里面包含已经安装的功能和新增加的nginx-rtmp-module,将这个可执行文件拷贝到当前安装目录(/usr/local/nginx/sbin)中就可以了。注意拷贝之前需要停止nginx,否则会报错。
验证nginx-rtmp-module是否安装好了
nginx -V
若打印的信息中包含nginx-rtmp-module,说明安装好了。
nginx.conf文件详细配置
worker_processes 1; #worker进程的数量
error_log logs/error.log error;
events {
worker_connections 1024; #每个worker进程可以接收多少个网络连接
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 8080;
server_name localhost;
location / {
root docs/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /live {
flv_live on; #open flv live streaming (subscribe)
chunked_transfer_encoding on; #open 'Transfer-Encoding: chunked' response
#不增加以下这两行配置的话,无法使用浏览器获取视频流
add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header
add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header
}
location /stat {
#configuration of streaming & recording statistics
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /var/www/rtmp; #specify in where stat.xsl located
}
location /control {
rtmp_control all; #configuration of control module of rtmp
}
}
}
rtmp_auto_push on;
rtmp_auto_push_reconnect 1s;
rtmp_socket_dir /home/tmp;
rtmp {
out_queue 4096;
out_cork 16;
max_streams 128;
timeout 15s;
drop_idle_publisher 15s;
log_interval 5s; #log 模块在 access.log 中记录日志的间隔时间,对调试非常有用
log_size 1m; #log 模块用来记录日志的缓冲区大小
server {
listen 1935;
application myapp {
live on;
allow publish all;
allow play all;
record off;
meta copy;
gop_cache on; #打开GOP缓存,减少首屏等待时间
}
}
}
obs配置


`这里是一些配置说明和示例
Application 创建一个RTMP应用,这里有点区别于http的location
Timeout 60s
stocket超时,可以配合keepalive和ping值来实现不让主机端长期处于监听连接客户端状态,实现快速关掉socket
Ping 3m
ping_timeout 30s
RTMP ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开
max_streams 32
设置RTMP流的最大数目,单一流数据最大限制,一般默认的32就可以了
ack_window 5000000
设置RTMP窗口的大小
chunk_size 4096
数据块大小 设置值越大CPU负载就越小
max_queue
最大队列数,一般默认即可
max_message 1M
输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对主机稳定性影响较大,所以一般默认即可。
out_queue
out_cork
Buflen 5s
设置默认缓冲区长度。通常客户端发送播放前RTMP set_buflen命令并重置该设置
访问控制
Access
Allow/deny
允许来自指定地址或者所有地址发布/播放
Allow public 127.0.0.1
Deny publish all;
Allow play 192.168.0.0/24
Deny play all;
Exec命令
Exce
exec_options on;
启动一些exec指令选项,通过一些exec事件来干预整个RTMP流
可以仔细一些外部编解码功能
Exec ffmpeg -i rtmp://localhost?src/\(name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv rtmp://localhost/hls/\)name 2>> /var/log/ffmpeg-$name.log;
Exce_statc
类似exce,属于静态命令,不支持传递上下文参数
Exec_kill_signal term;
Exec_kill_signal user1;
Exec_kill_signal 3;
Exec_pull
Exec_push
Exec_publish
指定与参数外部命令要在发布事件执行。
Exec_play
指定与要在打开事件执行外部命令
Exec_play_done
指定要在打开完成事件执行外部命令
Exec_publish_done
Exec_record_done
例子
exec_play bash -c “echo $addr $pageurl >> /tmp/clients”
Exec_publish base -c “echo $addr $flashver >> /tmp/publishers”
转录
Exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 \(dirname/\)basename.mp4
Live 模式
Live on
切换直播模式,即一对多广播
Meta on/copy/off
奇幻发送元数据到客户端 默认on
Interleave on/off
切换交叉模式。在该模式下,音视频会在同一个RTMPchunk流中传输。默认为off
wait_key on|off
使视频流从一个关键帧开始,默认为off
wait_video on|off
在一个视频帧发送前禁用音频。默认off
通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。
Publish_notify on
发送NetStream.Publish.Start和NetStream.Publish.Stop给用户,默认off
Drop_idle_publisher 10s
终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后)
Sync 10ms
同步音视频流。如果用户带宽不足以接收发布率,主机会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms
Play_restart off
使nginx-rtmp能够在发布启动或者停止时发送NetStream.Play.Start 和 NetStrem.Play.Stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on
Record 模式
Record off|all|audio|video|keyframes|manual
切换录制模式,流可以被记录到flv文件
Off 不录制
All 录制音频和视频
Audio
Video
Keyframes 只录制关键视频帧
Manual 不自动启动录制,使用控制接口来进行启动和停止
Record_path /tmp/rec
指定录制的flv文件存放目录
Record_suffix -%d-%b-%y-%T.flv
录制后缀strftime格式
Record_unique on|off
是否添加时间戳到录制文件,防止文件被覆盖,默认off
record_append on|off
切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off
record_lock on|off
锁定文件,调用系统的fcntl
record_max_size 128K
设置录制文件的最大值
Record_max_frames 2
设置每个录制文件的视频帧最大数量
Record_interval 1s/15m
在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_unique为off时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件
Record_notify on|off
奇幻当定义录制启动或者停止文件时发送NetStream.Record.Start和NetStream.Record.Stop状态信息onStatus到发布者。
应用
Application rtmp{
Live on;
Record all;
Record_path /var/rec;
Recorder audio{
Record audio;
Record_suffix .audio.flv;
}
Recorder chunked{
Record all;
Record_interval 15s;
Record_path /var/rec/chunked;
}
}
创建录制块。可以在单个application中创建多个记录 。
VOD媒体
Play dir|http://loc
播放指定目录或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整个文件下载完后才开始播放。同一个play可以播放多个视频地址(用于负载)。MP4格式要在编解码都被RTMP支持才可以播放。一般常见的就是H264/AAC
Application vod{
Play /var/flvs;
}
Application vod_http{
Play http://localhost/vod;
}
Play_temp_path /www
设置远程VOD文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。
Play_local_path dir
在播放前设置远程存储VOD文件路径,默认/tmp
Play_local_path /tmp/videos;
Paly /tmp/videos http://localhost/videos
表示播放视频,先播放本地缓存,如果没有的话,从localhost/videos下载到本地/tmp/videos后,在进行播放
Relay模式
Pull url [key=value]
创建pull中继。主要是从远程主机拉取流媒体。并进行重新发布。
Url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。
参数如下(使用Key=Value方式)
app 明确application名
Name 捆绑到relay的bending流名称。如果为空,那么会使用application中所有本地流
tcUrl
pageUrl
swfUrl
flashVer
playPath
Live
Start
Stop
Static
Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel;
Push url [key=value]
与pull类似,只是push推送发布流到远程主机。
Push_reconnect 1s
在断开连接后,在push重新连接钱等待的时间,默认3秒
Session_relay on;
切换会话relay模式。在这种情况下关闭时relay销毁。
Notify 模式
这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当HTTP返回2xx成功状态码时,RTMP会话继续。3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。
On_connect url
设置HTTP连接回调。当客户分发连接命令时。
例子:
On_connect http://localhost/my_auth;
Location /on_connect{
If(\(arg_flashver != “my_secret_flashver”){
Rewrite ^.*\) fallback?permanent;
}
}
On_play url
设置HTTP播放回调。分发客户分发播放命令时。
http {
Location /redirect {
Rewrite ^.$ newname?permanent;
}
}
Rtmp{
Application myqpp{
Live on;
On_play http://localhost/redirect;
}
}
On_publish
On_doone
On_play_done
On_publish_done
On_record_done
On_update
Notify_update_timeout
设置on_update回调时间
Notify_update_strict on|off
Notify_relay_redirect on
Notify_method get
设置HTTP方法通知,默认是application/x-www-form-urlencodeed 的POST内容类型。有时候可能会需要GET方法,在nginx的http{}部分处理调用。在这种情况下可以使用arg_变量去访问参数。
例如如果是method为get时
Location /on_play{
If(\(arg_pageUrl ~* localhost){
Return 200;
}
Return 500;
}
HLS 模式
Hls on|off
使application 切换HLS协议直播
Hls_path /tmp/hls;
设置HLS播放列表和分段目录。这一目录必须在nginx启动前就已经存在。
Hls_fragment 15s;
设置HLS分段长度,默认5秒,这个跟直播延迟有比较大的影响
Hls_playlist_length 20m;
设置HLS播放列表长度,默认30秒。这个跟直播缓存有关。
Hls_sync time
设置HLS时间戳同步阈值。默认2ms。这个功能防止由低分辨率RTMP(1KHz)转换到高分辨率MPEG-TS(90KHz)之后出现的噪音。
Hls_continuous on|off
切换HLS连续模式,默认off。
Hls_nested on|off
切换HLS嵌套模式。默认off。
Hls_cleanup on|off;
切换HLS清理。默认on
AccessLog日志
Access_log off|path [format_name]
Log_format new_format ‘\)remote_addr';
Access_log logs/rtmp_access.log new_format;
Log_format 指定日志格式
创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有:
- connection - 连接数。
- remote_addr - 客户端地址。
- app - application 名。
- name - 上一个流名。
- args - 上一个流播放/发布参数。
- flashver - 客户端 flash 版本。
- swfurl - 客户端 swf url。
- tcurl - 客户端 tcUrl。
- pageurl - 客户端页面 url。
- command - 客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。
- bytes_sent - 发送到客户端的字节数。
- bytes_received - 从客户端接收到的字节数。
- time_local - 客户端连接结束的本地时间。
- session_time - 持续连接的秒数。
- session_readable_time - 在可读格式下的持续时间。
默认的日志格式叫做 combined。这里是这一格式的定义:
\(remote_addr [\)time_local] \(command "\)app" "\(name" "\)args" -
$bytes_received \(bytes_sent "\)pageurl" "\(flashver" (\)session_readable_time)
Limits限制
max_connections number;
设置rtmp引擎最大连接数,默认off
Application hls{
Live on;
Hls on;
Hls_path /tmp/hls;
Hls_fragment 15s;
}`

浙公网安备 33010602011771号