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

本文详述了nginx pushstream模块的组成部分,包括模块配置、指令、上下文和初始化过程。通过理解模块的配置结构和指令定义,读者能够掌握如何在nginx配置文件中正确使用该模块。此外,文章还介绍了模块初始化时涉及的主要函数及其作用,特别是与进程间通信(IPC)相关的部分,为深入理解模块工作原理提供了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文重点介绍push stream模块的构成,至于nginx如何启动、维护该模块不会详细阐述,以后有时间会做详细阐述。
[b][size=large]一、模块定义[/size]
[size=medium]1.1. 模块配置[/size][/b]

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

具体模块配置请参考nginx官网:[url]http://wiki.nginx.org/HttpPushStreamModule[/url]
[b][size=medium]1.2. 模块指令[/size][/b]
模块的指令是定义在一个叫做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 },


[b][size=medium]1.3. 模块上下文[/size][/b]
静态的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 */
};


[b][size=medium]1.4. 模块定义[/size][/b]

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
};


[b][size=large]二、初始化[/size][/b]
由上文可以看出,nginx初始化时会调用ngx_http_push_stream_init_module和ngx_http_push_stream_init_worker两个函数,下面看下它们都干了什么
[b][size=medium]2.1. 模块初始化(init_module)[/size][/b]

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);
}


代码很简单
[list]
[*] 获取conf
[*] 初始化IPC
[/list]
[b]2.1.1 IPC[/b]
该模块的IPC是对nginx的master与worker间IPC的扩展,有关nginx的进程间通信请参见[url]http://simohayha.iteye.com/blog/467940[/url]
简单来讲,master与worker直接的通信模型为:
[list]
[*]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
[/list]
由于master为worker创建的channel(socketpair)只处理特定的指令,push stream模块创建了供自己使用的socketpair:
[list]
[*]模块初始化时为所有worker创建一个socketpair
[*]master创建worker时,worker会完全继承由模块创建的socketpair读端与写端。
[*]worker可借助由push stream模块创建的socketpair实现全双工通信
[/list]
[b][size=medium]2. ngx worker初始化(ngx_http_push_stream_init_worker)[/size][/b]

[img]http://dl.iteye.com/upload/attachment/615430/509cafab-46ed-35a0-8ad9-a4f17c487468.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值