`
godlovesdog
  • 浏览: 99956 次
社区版块
存档分类
最新评论

nginx-push-stream模块源码学习(二)——模块初始化

 
阅读更多
        本文重点介绍push stream模块的构成,至于nginx如何启动、维护该模块不会详细阐述,以后有时间会做详细阐述。
一、模块定义
1.1.  模块配置


        通用nginx模块的配置struct有三种,分别是main,server和location。本模块会涉及到main和location两个域的配置。名称分别为:ngx_http_push_stream_main_conf_t和ngx_http_push_stream_loc_conf_t. 

       具体模块配置请参考nginx官网:http://wiki.nginx.org/HttpPushStreamModule
1.2.  模块指令
  模块的指令是定义在一个叫做ngx_command_t的静态数组中的,或用于在nginx配置文件中设定模块的相关参数或处理相应请求,先简单来说下ngx_command_t的定义:
struct ngx_command_t {
    ngx_str_t             name;//指令名称
    ngx_uint_t            type;//指令类型——该指令可用于ngx conf的哪个域——main?server?location?
    /*命令所对应的处理函数指针,参数
          @指向结构体 ngx_conf_t 的指针, 这个结构体里包含需要传递给指令的参数;
          @指向结构体 ngx_command_t 的指针;
          @指向模块自定义配置结构体的指针
    */
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
    ngx_uint_t            conf;//指定参数存储区域(main?server?loc?)
    ngx_uint_t            offset;//指定数据保存位置
    void                 *post;//指向模块在读配置的时候需要的一些零碎变量
};

比如:
{ ngx_string("push_stream_publisher"),
    NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,//指令用在location域,没有参数或1个参数
    ngx_http_push_stream_publisher,//发布处理函数
    NGX_HTTP_LOC_CONF_OFFSET,//参数存储在location域
    offsetof(ngx_http_push_stream_loc_conf_t, location_type),
    NULL },
{ ngx_string("push_stream_subscriber"),
    NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,
    ngx_http_push_stream_subscriber,
    NGX_HTTP_LOC_CONF_OFFSET,
    offsetof(ngx_http_push_stream_loc_conf_t, location_type),
    NULL },


1.3.  模块上下文
       静态的ngx_http_module_t结构体,包含一大坨函数引用,用来创建和合并三段配置 (main,server,location):
static ngx_http_module_t    ngx_http_push_stream_module_ctx = {
    NULL,                                       /* preconfiguration */
    ngx_http_push_stream_postconfig,            /* postconfiguration */
    ngx_http_push_stream_create_main_conf,      /* create main configuration */
    ngx_http_push_stream_init_main_conf,        /* init main configuration */
    NULL,                                       /* create server configuration */
    NULL,                                       /* merge server configuration */
    ngx_http_push_stream_create_loc_conf,       /* create location configuration */
    ngx_http_push_stream_merge_loc_conf,        /* merge location configuration */
};


1.4.  模块定义
ngx_module_t    ngx_http_push_stream_module = {
    NGX_MODULE_V1,
    &ngx_http_push_stream_module_ctx,           /* module context */
    ngx_http_push_stream_commands,              /* module directives */
    NGX_HTTP_MODULE,                            /* module type */
    NULL,                                       /* init master */
    ngx_http_push_stream_init_module,           /* init module */
    ngx_http_push_stream_init_worker,           /* init process */
    NULL,                                       /* init thread */
    NULL,                                       /* exit thread */
    ngx_http_push_stream_exit_worker,           /* exit process */
    ngx_http_push_stream_exit_master,           /* exit master */
    NGX_MODULE_V1_PADDING
};


二、初始化
        由上文可以看出,nginx初始化时会调用ngx_http_push_stream_init_module和ngx_http_push_stream_init_worker两个函数,下面看下它们都干了什么
2.1.  模块初始化(init_module)
static ngx_int_t
ngx_http_push_stream_init_module(ngx_cycle_t *cycle)
{
    ngx_core_conf_t                         *ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module
);

    if ((ngx_http_push_stream_module_main_conf == NULL) || !ngx_http_push_stream_module_main_conf->enabled) {
        ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "ngx_http_push_stream_module will not be used with this configu
ration.");
        return NGX_OK;
    }

    // initialize our little IPC
    return ngx_http_push_stream_init_ipc(cycle, ccf->worker_processes);
}


代码很简单
  • 获取conf
  • 初始化IPC

2.1.1 IPC
       该模块的IPC是对nginx的master与worker间IPC的扩展,有关nginx的进程间通信请参见http://simohayha.iteye.com/blog/467940
       简单来讲,master与worker直接的通信模型为:
  • master每次创建worker之前,创建一个channel(socketpair),fork后worker继承该socketpair
  • master保留所有worker的socketpair从而可以向所有worker发送控制指令。
  • worker继承socketpair时,仅保留master为自己创建的socketpair的读端以及master为其他worker创建的socketpair的写端,从而可实现worker间的进程间通信
  • 由于worker创建时序的不同,先创建的worker无法获悉后创建worker的chaneel信息,为此master每次创建channel后以将新创建的channel信息以指令的形式通知先前创建的worker

       由于master为worker创建的channel(socketpair)只处理特定的指令,push stream模块创建了供自己使用的socketpair:
  • 模块初始化时为所有worker创建一个socketpair
  • master创建worker时,worker会完全继承由模块创建的socketpair读端与写端。
  • worker可借助由push stream模块创建的socketpair实现全双工通信

2.  ngx worker初始化(ngx_http_push_stream_init_worker)


  • 大小: 16.2 KB
分享到:
评论

相关推荐

    nginx-rtmp-module-master源码

    1. 下载 Nginx 源码和 Nginx-RTMP 模块源码。 2. 使用 `./configure` 命令配置 Nginx,添加 RTMP 模块。 3. 编译并安装 Nginx。 4. 编写 Nginx 配置文件,定义 RTMP 直播应用、流处理规则等。 5. 启动 Nginx 服务。 ...

    nginx带nginx-http-flv模块windows编译版rtmp

    Nginx-RTMP是Nginx的一个扩展模块,由Adobe Systems开发,用于支持Real-Time Messaging Protocol (RTMP)。RTMP是一种协议,常用于在线流媒体传输,如视频直播服务。Nginx-RTMP模块允许Nginx接收来自Flash Player或...

    nginx-rtmp模块源码包nginx-rtmp-module-master

    这个源码包 "nginx-rtmp-module-master" 包含了 Nginx-RTMP 模块的源代码,对于运维人员来说,了解并掌握其工作原理和配置方法对于搭建和维护实时流媒体服务器至关重要。 **一、Nginx 简介** Nginx 是一款高性能的 ...

    添加nginx-http-flv-module模块并重新编译后的nginx(windows版)

    本资源提供的是一款针对Windows平台的Nginx,其中已经集成了`nginx-http-flv-module`模块,这个模块主要用于支持HTTP实时流(HTTP Live Streaming, HLS)和Flash视频流(Flash Video, FLV)。现在我们将深入探讨这一...

    nginx-upload-module模块源码

    nginx-upload-module模块源码,用于nginx配置文件上传功能

    nginx-upload-progress模块源码

    1. **初始化阶段**:当客户端发起文件上传请求时,`nginx-upload-progress` 模块会在内存中创建一个进度条记录,并将其与请求关联起来。 2. **数据传输**:在文件传输过程中,模块会持续更新该记录,包含已上传的...

    rh-nginx118-nginx-mod-stream-1.18.0-3.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    集成了nginx-http-flv-module 1.2.9模块的64位nginx-1.21.4程序

    而HTTP FLV模块(nginx-http-flv-module)则是Nginx支持实时流媒体传输的重要扩展,它使得Nginx能够处理Flash Video(FLV)格式的流媒体数据,提供流畅的视频播放体验。 本文将深入探讨集成`nginx-...

    nginx-module-vts.tar.gz

    Nginx-Module-VTS是Nginx的一个增强模块,主要功能是提供详细的Web服务器访问统计和性能监控。Prometheus是一款流行的开源监控和警报工具,广泛用于收集和分析各种系统的指标。在本场景中,Nginx-Module-VTS与...

    带nginx-rtmp-module模块的Nginx

    【标题】: "带nginx-rtmp-module模块的Nginx" 在当今互联网技术日新月异的时代,实时流媒体传输已经成为在线视频分享、直播、远程教育等应用场景不可或缺的一部分。Nginx,作为一款高性能的HTTP和反向代理服务器,...

    nginx-mod-stream-1.14.1-9.module_el8.0.0+184+e34fea82.x86_64.rpm

    离线安装包,亲测可用

    nginx-http-flv-module-1.2.10(包含nginx-rtmp-module)

    而nginx-rtmp-module则是一个额外的Nginx模块,它增加了对Real-Time Messaging Protocol (RTMP)的支持,使Nginx能够作为RTMP服务器接收并分发直播流。 1. **HTTP FLV 模块详解** HTTP FLV模块使得Nginx可以处理FLV...

    nginx + nginx-http-flv-module-1.2.9

    在解压的 `nginx-http-flv-module-1.2.9` 文件夹中,你可以找到模块的源码。通过在 Nginx 的 configure 脚本中添加模块路径,然后执行 `make` 和 `make install` 进行编译和安装。 4. **配置文件** 在 `conf` 目录...

    nginx-rtmp-module-1.2.1.zip

    4. 下载 RTMP 模块源码:`git clone https://github.com/arut/nginx-rtmp-module.git` 5. 配置并编译:`./configure --add-module=../nginx-rtmp-module && make && sudo make install` 6. 配置 Nginx 配置文件...

    nginx-1.19.3_nginx-http-flv-module.rar

    压缩包子文件的文件名"nginx-1.19.3_Compiled"表示包含了编译好的Nginx服务器,这通常包括配置文件、二进制可执行文件和其他必要的库文件。用户解压后,可以在自己的服务器上直接部署这个版本的Nginx,无需经历复杂...

    nginx-1.19.3-http-flv.zip

    1. 采用nginx最新版编译,包含最新的nginx-http-flv-module,以及基础模块openssl、prce、zlib 2. 整体打包,已配置好nginx.conf的http-flv直播流,以及http web环境。无需任何配置即可使用 3. 自带windows的服务...

    nginx-sticky-module-ng-1.2.6.tar.gz

    在 `nginx-sticky-module-ng-1.2.6` 压缩包中,通常包含以下组件: 1. `src`: 这是源代码目录,包含了模块的核心代码,如 `ngx_http_sticky_module.c`,它是实现会话保持功能的主要源文件。 2. `config`: 配置脚本...

    nginx无证书情况用stream模块反向代理https网站 nginx-1.15.10 windows编译版

    nginx无证书情况用stream模块反向代理https网站 windows编译版 如何使用请参考https://blog.csdn.net/gggauss/article/details/89140446

    fastdfs-nginx-module-1.24

    2. 下载 FastDFS-nginx-module:获取最新的 1.24 版本源码包,并解压到指定目录。 3. 编译和安装模块:将模块编译进 Nginx,通常涉及到修改 Nginx 的配置文件,添加模块路径。 4. 配置 Nginx:配置 Nginx 的 server ...

    nginx-rtmp-module

    二、安装 Nginx 和 Nginx-RTMP-Module 1. 安装 Nginx: 在大多数 Linux 发行版中,可以通过包管理器(如 apt-get 或 yum)轻松安装 Nginx。例如,在 Ubuntu 上: ``` sudo apt-get update sudo apt-get install...

Global site tag (gtag.js) - Google Analytics