Nginx RTMP 通知模块 (ngx_rtmp_notify_module) 详细分析

1. 配置指令

模块通过 ngx_rtmp_notify_commands 定义了多个配置指令,这些指令允许用户配置与 RTMP 会话相关的事件通知 URL 和方法。

enum {
    NGX_RTMP_NOTIFY_PLAY,
    NGX_RTMP_NOTIFY_PUBLISH,
    NGX_RTMP_NOTIFY_PLAY_DONE,
    NGX_RTMP_NOTIFY_PUBLISH_DONE,
    NGX_RTMP_NOTIFY_DONE,
    NGX_RTMP_NOTIFY_RECORD_DONE,
    NGX_RTMP_NOTIFY_UPDATE,
    NGX_RTMP_NOTIFY_APP_MAX
};


enum {
    NGX_RTMP_NOTIFY_CONNECT,
    NGX_RTMP_NOTIFY_DISCONNECT,
    NGX_RTMP_NOTIFY_SRV_MAX
};
  • 事件相关指令

    • on_connect:配置连接事件的通知 URL。

    • on_disconnect:配置断开连接事件的通知 URL。

    • on_publish:配置发布流的通知 URL。

    • on_play:配置播放流的通知 URL。

    • on_publish_done:配置发布流完成后的通知 URL。

    • on_play_done:配置播放流完成后的通知 URL。

    • on_done:配置完成事件的通知 URL。

    • on_record_done:配置录制完成的通知 URL。

    • on_update:配置更新事件的通知 URL。

  • HTTP 方法配置

    • notify_method:配置 HTTP 请求使用的方法(GET 或 POST)。

  • 时间相关配置

    • notify_update_timeout:设置更新事件的超时时间。

    • notify_update_strict:设置是否严格要求更新操作成功。

  • 转发相关配置

    • notify_relay_redirect:配置是否允许转发(relay)重定向。

这些配置通过 ngx_rtmp_notify_on_srv_eventngx_rtmp_notify_on_app_event 进行解析,分别用于服务器级别和应用级别的事件通知配置。

2. 配置合并与创建

  • ngx_rtmp_notify_create_app_conf

    • 用于创建应用级的配置结构体 ngx_rtmp_notify_app_conf_t,它存储了关于各类事件的 URL 配置、方法(GET 或 POST)、更新超时时间等信息。

  • ngx_rtmp_notify_create_srv_conf

    • 用于创建服务器级的配置结构体 ngx_rtmp_notify_srv_conf_t,主要存储与服务器相关的事件通知配置。

  • ngx_rtmp_notify_merge_app_confngx_rtmp_notify_merge_srv_conf

    • 这两个函数用于合并父级和子级的配置,确保配置的继承和覆盖。

3. 通知请求的创建

通知请求的创建通过以下函数实现:

  • ngx_rtmp_notify_create_request

    • 根据给定的 url_idx 和参数,创建 HTTP 请求的数据链表。该函数格式化并构建请求,发送到对应的 URL。根据配置的 HTTP 方法(GET 或 POST),选择不同的请求格式。

  • ngx_rtmp_notify_connect_createngx_rtmp_notify_disconnect_createngx_rtmp_notify_publish_createngx_rtmp_notify_play_create 等:

    • 这些函数负责根据不同的 RTMP 事件(如连接、断开、发布、播放等)构建 HTTP 请求的数据体(如事件名称、应用名、URL 等)。它们会生成合适的请求链表(ngx_chain_t),并交给 ngx_rtmp_notify_create_request 来最终生成 HTTP 请求。

4. 事件处理

  • ngx_rtmp_notify_connect_handle

    • 该函数处理连接事件的通知。如果服务器返回了 3xx 重定向响应,模块会尝试解析重定向的目标地址并执行重定向。

  • ngx_rtmp_notify_publish_handle

    • 处理发布事件的通知。如果发生重定向(如推流到另一个地址),模块会更新发布流的 URL,并重新执行推流。

  • ngx_rtmp_notify_play_handle

    • 处理播放事件的通知。如果发生重定向,模块会更新播放流的 URL,并重新执行播放。

  • ngx_rtmp_notify_update_handle

    • 处理更新事件的通知。根据配置的超时限制(update_timeout),定期发送更新请求。

  • ngx_rtmp_notify_record_done_handle

    • 处理录制完成事件的通知。记录完毕后,向配置的 URL 发送通知。

5. 会话和标志管理

  • ngx_rtmp_notify_init

    • 初始化 RTMP 会话的通知状态,包括设置事件的名称、参数和标志。如果配置了更新事件的 URL,并且设置了超时时间,它会初始化定时器并定期发送更新事件。

  • ngx_rtmp_notify_clear_flag

    • 清除会话中的标志位,用于处理事件完成后的状态重置。

6. HTTP 响应解析

  • ngx_rtmp_notify_parse_http_retcode

    • 解析 HTTP 响应的状态码。如果返回 2xx,表示成功;如果返回 3xx,表示重定向;其他状态则表示失败。

  • ngx_rtmp_notify_parse_http_header

    • 解析 HTTP 响应头部,用于提取重定向的目标地址或其他响应内容。

7. 最终处理与回调

  • ngx_rtmp_notify_done

    • 在事件完成时调用,通过回调通知外部系统事件已经处理完毕。

  • ngx_rtmp_notify_done_create

    • 用于创建完成事件的请求数据,通常是响应外部系统的回调请求。

8. 总结与扩展

该模块的核心作用是监听 RTMP 流会话的各种事件,并通过 HTTP 通知外部系统。通过配置指令,用户可以灵活地指定哪些事件需要被通知,并设置通知的方式(如 HTTP POST 或 GET)。对于直播和推流应用,实时的通知机制是非常重要的,可以用于实现监控、告警、统计等功能。

模块的工作流程:

  1. 配置 RTMP 事件和对应的通知 URL。

  2. 监听 RTMP 事件(如连接、断开、发布、播放等)。

  3. 在事件触发时,根据配置生成 HTTP 请求,发送通知。

  4. 如果发生重定向,自动处理并更新通知目标。

对于初学者来说,理解该模块的核心工作是如何在 RTMP 流事件发生时,构建通知请求,并通过 HTTP 通知外部系统。