Nginx RTMP 统计模块 (ngx_rtmp_stat_module.c) 详细分析

ngx_rtmp_stat_module 是 Nginx RTMP 模块中的统计模块,提供了实时 RTMP 流量统计功能,允许 Nginx RTMP 服务器输出与流、带宽、客户端等相关的统计信息。这些统计信息通常以 XML 格式输出,供外部监控和管理系统使用。此模块允许通过 HTTP 请求查看 RTMP 服务器的各种统计信息。

1. 模块配置

1.1 ngx_rtmp_stat_loc_conf_t

这个结构体用于存储 RTMP 统计模块的配置。它包含以下字段:

  • stat:位掩码,用于表示要启用的统计类别(如全局统计、实时流统计、客户端统计等)。

  • stylesheet:指定用于格式化输出的 XSL 样式表(可选)。

1.2 ngx_rtmp_stat_masks

该数组定义了与 ngx_rtmp_stat 指令相关的标志:

  • NGX_RTMP_STAT_ALL:表示启用所有统计。

  • NGX_RTMP_STAT_GLOBAL:启用全局统计(如带宽、字节数等)。

  • NGX_RTMP_STAT_LIVE:启用实时流统计。

  • NGX_RTMP_STAT_CLIENTS:启用客户端统计。

  • NGX_RTMP_STAT_PLAY:启用播放流统计。

1.3 ngx_rtmp_stat_commands

该数组定义了模块的配置指令:

  • rtmp_stat:用于启用 RTMP 统计功能并设置统计类别。

  • rtmp_stat_stylesheet:用于设置 XSL 样式表的路径,以便对 XML 输出结果进行格式化。

2. 初始化和配置函数

2.1 ngx_rtmp_stat_init_process

在 Nginx 启动时调用此函数。它会在 HTTP 处理之前处理已注册的事件,确保 RTMP 统计功能在进程初始化时正确配置。

2.2 ngx_rtmp_stat_postconfiguration

在 Nginx 完成配置之后调用此函数。它主要用于记录服务器的启动时间 (start_time),以便在统计中使用。

2.3 ngx_rtmp_stat_create_loc_confngx_rtmp_stat_merge_loc_conf

这两个函数用于创建和合并 Nginx 配置:

  • ngx_rtmp_stat_create_loc_conf:用于创建默认的统计配置。

  • ngx_rtmp_stat_merge_loc_conf:合并父配置和子配置,确保从全局、服务器到位置的配置继承。

3. RTMP 统计输出

3.1 ngx_rtmp_stat_escape

此函数用于处理和转义 HTML 中不允许的字符。它会遍历输入数据,并将不符合 ASCII 范围的字符替换为空格。这样做是为了确保生成的 XML 输出可以安全地嵌入到 HTML 页面中,避免 XSS 攻击等安全问题。

3.2 ngx_rtmp_stat_output

该函数用于将统计数据输出到 HTTP 响应中。它会将数据格式化并输出为 XML 格式。根据是否需要转义 HTML 字符,函数会调用 ngx_rtmp_stat_escape 进行处理,并将处理后的数据写入到 Nginx 的输出链(ngx_chain_t)中。

3.3 ngx_rtmp_stat_bw

用于输出带宽统计数据。它会根据传入的标志(NGX_RTMP_STAT_BWNGX_RTMP_STAT_BYTES)决定输出的带宽信息或字节数。常用于显示每秒的流量或累计的传输字节。

3.4 ngx_rtmp_stat_client

此函数用于输出客户端的统计信息。它会显示每个连接的详细信息,包括客户端 ID、IP 地址、连接时间、Flash 版本、页面 URL、SWF URL 等。

3.5 ngx_rtmp_stat_live

该函数用于输出实时流的统计信息。它遍历每个流,并输出流的带宽、客户端数量等信息。对于每个流,还会列出连接到该流的客户端的信息。

3.6 ngx_rtmp_stat_play

输出播放流的统计信息。此函数遍历所有的播放流并输出每个流的相关信息,包括流的带宽、客户端数量、时间戳等。

3.7 ngx_rtmp_stat_application

该函数用于输出 RTMP 应用的统计信息。它会列出与应用相关的所有实时流和播放流的统计。

3.8 ngx_rtmp_stat_server

输出 RTMP 服务器的统计信息。它会遍历所有的应用,输出每个应用的统计信息。

4. RTMP 统计请求处理

4.1 ngx_rtmp_stat_handler

该函数处理 HTTP 请求,返回 RTMP 统计信息。它根据配置的统计选项输出不同的内容(如全局统计、流统计、客户端统计等)。如果请求的统计项没有启用,则返回 NGX_DECLINED,否则输出格式化后的 XML 数据。

该函数还负责设置响应的 HTTP 头(如 Content-Typetext/xmlContent-Length 为统计数据的长度)。它会调用相应的统计输出函数,如 ngx_rtmp_stat_serverngx_rtmp_stat_application 等。

5. 总结

Nginx RTMP 统计模块的主要功能是提供 RTMP 流的实时统计信息,帮助管理员监控流量、客户端状态、播放流等数据。通过 HTTP 请求,可以获取全局统计、实时流统计、客户端统计等信息,格式化为 XML 输出。

  1. 配置指令:如何通过 rtmp_stat 指令启用统计功能,并选择需要的统计项(如全局、直播、客户端、播放等)。

  2. 统计输出:如何通过函数生成统计数据并输出为 XML 格式,供外部监控系统使用。

  3. 带宽和客户端统计:如何收集并显示带宽使用情况、连接的客户端信息、实时流的带宽和客户端数量等。

理解这些内容后,初学者可以有效地配置和扩展 RTMP 统计功能,并根据实际需要获取不同维度的实时流量和客户端数据。