进程间回源
graph LR;
pub[推流端]
p0[worker进程0]
p1[worker进程1]
p2[worker进程2]
pl0[拉流端0]
pl1[拉流端1]
pl2[拉流端2]
pl3[拉流端3]
pub-->p0
p0-->p1
p0-->p2
p1-->pl0
p1-->pl1
p2-->pl2
p2-->pl3
在nginx多进程情况下rtmp或http连接被分配到不同worker进程,推流端连接和拉流端连接可能会被分配到不同进程,从而导致一定概率的无法拉流。
为了解决这个问题,我们可以让其他进程向推流端连接的进程回源。由于这种方式跟跨服务器之间的回源逻辑一致,所以我们将这种操作称为进程间回源
。
配置
rtmp_auto_pull
Syntax: rtmp_auto_pull on|off
Default: off
Context: rtmp, server, application
- Desc
进程间回源开关,on 开启进程间回源,off关闭进程间回源,如果你希望使用nginx的多进程模式,必须要将rtmp_auto_pull设置成on。
rtmp_auto_pull_port
Syntax: rtmp_auto_pull_port value
Default: -
Context: rtmp, server, application
- Desc
进程间回源所使用的unix套接字地址,需要注意的是此地址必须要与multi_listen
中的保持一致。
multi_listen
Syntax: multi_listen [unix socket] [rtmp port]
Default: -
Context: event
- Desc
multi_listen的作用是让每个worker进程监听不同的unix套接字,然后通过向不同unix套接字推拉流实现多进程的流共享。
配置模板
```nginx
user root;
daemon on;
master_process on;
worker_processes 6; # 开启6个worker进程
error_log logs/error.log info;
events {
use epoll;
worker_connections 1024;
multi_listen unix:/tmp/rtmp 1935; # 为1935端口开启多进程端口映射,每个进程都开启一个unix套接字映射到1935端口上
}
rtmp {
rtmp_auto_pull on;
rtmp_auto_pull_port unix:/tmp/rtmp; # 进程间回源使用的unix套接字地址,该地址必须与 multi_listen 中的配置一致
server {
listen 1935;
application live {
live on;
}
}
}
http {
server {
listen 80;
location /flv {
flv_live 1935 app=live;
}
location /ts {
ts_live 1935 app=live;
}
}
}
```