Nginx 一般情况下都是以多进程方式(一个 master 进程和多个 worker 进程)运行的,但是 nginx-rtmp-module 模块对多进程方式的支持很不成熟。
前面的文章提到过以多进程方式运行 Nginx 时,由于 nginx-rtmp-module 本身不支持 Vhost 功能,再加上它使用 Unix domain socket(没有端口信息)转发媒体流到其他的 worker 进程,导致其他的 worker 进程无法知道转发的媒体流需要匹配的是哪个 server 配置。
Nginx 从 1.9.11 版本开始,在类 Unix 系统上支持将第三方模块编译成动态模块,可以在运行时加载它们。这又引出多进程方式下运行 nginx-rtmp-module 的另一个问题。
这个问题产生的背景是:用户 A 开发了自己的第三方模块(不开源),用户 B 在 nginx-rtmp-module 的基础上开发了一些新的功能(也不开源),用户 A 想在最新稳定版本的 Nginx(1.18.0)中使用用户 B 开发的新功能,用户 B 告诉用户 A,你把你的第三方模块编译成动态模块,然后你告诉我除了你编译的动态模块之外的编译参数,我把我的第三方模块也编译成动态模块,这样我(用户 B)就可以在不用获得你(用户 A)自己开发的第三方模块前提下也能编译出与你(用户 A)的 Nginx 二进制兼容的第三方模块了。
用户 A 照做了,用户 B 将编译好的基于 nginx-rtmp-modul