Nginx RTMP 限制模块分析 (ngx_rtmp_limit_module.c)

ngx_rtmp_limit_module.c 实现了一个 Nginx RTMP 模块,主要功能是限制 RTMP 连接的数量。该模块使用共享内存来维护连接的计数,并在超过最大连接数时拒绝新连接。下面我们来详细分析这段代码。

1. 核心数据结构

1.1 ngx_rtmp_limit_main_conf_t

这个结构体用于存储 RTMP 限制模块的主配置:

  • max_conn:最大连接数,控制允许的最大并发 RTMP 连接数。

  • shm_zone:共享内存区域,用于存储当前连接数。

1.2 ngx_rtmp_limit_commands

这是一个指令数组,包含了模块的配置指令:

  • max_connections:用来设置最大允许的连接数,通过 ngx_conf_set_num_slot 来处理该指令。

2. 模块生命周期

2.1 ngx_rtmp_limit_create_main_conf

该函数在模块初始化时创建主配置结构 ngx_rtmp_limit_main_conf_t,并初始化最大连接数为 NGX_CONF_UNSET,表示默认未设置。

2.2 ngx_rtmp_limit_postconfiguration

该函数在 Nginx 配置文件解析完成后调用,负责完成以下任务:

  • 获取 RTMP 核心配置并将 ngx_rtmp_limit_connectngx_rtmp_limit_disconnect 函数注册到相应的 RTMP 事件(连接和断开事件)。

  • 设置共享内存区域,用于存储连接计数。通过 ngx_shared_memory_add 创建共享内存区域,并设置初始化函数 ngx_rtmp_limit_shm_init

3. 连接限制处理

3.1 ngx_rtmp_limit_connect

该函数在客户端连接时被调用:

  • 从共享内存中获取当前连接数 nconn

  • 如果当前连接数超过了配置的最大连接数 max_conn,则返回 NGX_ERROR,拒绝新的连接。

  • 否则,增加连接计数并继续处理连接。

3.2 ngx_rtmp_limit_disconnect

该函数在客户端断开时被调用:

  • 从共享内存中获取当前连接数 nconn

  • 减少连接计数,表示一个连接已断开。

3.3 ngx_rtmp_limit_shm_init

该函数用于初始化共享内存区域:

  • 如果已有数据,则直接使用。

  • 如果没有数据,则分配一个 4 字节的空间来存储连接数,并初始化为 0。

4. 共享内存与锁机制

该模块使用了共享内存 (ngx_shm_zone_t) 来维护连接计数。为了保证并发情况下连接计数的准确性,模块使用了互斥锁 (ngx_shmtx_lockngx_shmtx_unlock) 来保护对共享内存的访问。

5. 模块配置与事件绑定

5.1 ngx_rtmp_limit_postconfiguration

在配置阶段,ngx_rtmp_limit_postconfiguration 会将 ngx_rtmp_limit_connectngx_rtmp_limit_disconnect 绑定到 RTMP 连接和断开事件。这意味着每当有 RTMP 客户端连接或断开时,都会触发这两个函数来进行连接数的控制。

6. 总结

  • 功能概述

    • 该模块主要功能是限制 RTMP 流的最大连接数。通过共享内存来维护当前连接数,当连接数超过最大限制时,拒绝新的连接。

  • 配置指令

    • max_connections 用于设置最大连接数,超出连接数限制时会拒绝新连接。

  • 共享内存与锁

    • 使用共享内存来记录当前连接数,利用互斥锁保证在多线程环境下对连接数的安全访问。

  • 连接与断开事件

    • 在连接和断开时,分别调用 ngx_rtmp_limit_connectngx_rtmp_limit_disconnect 处理连接数的增加和减少。

可以通过以下几个点来理解该模块:

  1. 最大连接数的控制:通过共享内存维护连接计数,超出限制时拒绝连接。

  2. 共享内存的使用:通过 ngx_shm_zone_t 创建共享内存,用于跨多个进程共享连接数。

  3. 事件处理:通过 RTMP 事件(连接和断开事件)触发对连接数的管理,控制 RTMP 服务器的负载。