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的定义: 

C代码   收藏代码
  1. struct ngx_command_t {  
  2.     ngx_str_t             name;//指令名称  
  3.     ngx_uint_t            type;//指令类型——该指令可用于ngx conf的哪个域——main?server?location?  
  4.     /*命令所对应的处理函数指针,参数 
  5.           @指向结构体 ngx_conf_t 的指针, 这个结构体里包含需要传递给指令的参数; 
  6.           @指向结构体 ngx_command_t 的指针; 
  7.           @指向模块自定义配置结构体的指针 
  8.     */  
  9.     char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);  
  10.     ngx_uint_t            conf;//指定参数存储区域(main?server?loc?)  
  11.     ngx_uint_t            offset;//指定数据保存位置  
  12.     void                 *post;//指向模块在读配置的时候需要的一些零碎变量  
  13. };  


比如: 

C代码   收藏代码
  1. { ngx_string("push_stream_publisher"),  
  2.     NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,//指令用在location域,没有参数或1个参数  
  3.     ngx_http_push_stream_publisher,//发布处理函数  
  4.     NGX_HTTP_LOC_CONF_OFFSET,//参数存储在location域  
  5.     offsetof(ngx_http_push_stream_loc_conf_t, location_type),  
  6.     NULL },  
  7. { ngx_string("push_stream_subscriber"),  
  8.     NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS|NGX_CONF_TAKE1,  
  9.     ngx_http_push_stream_subscriber,  
  10.     NGX_HTTP_LOC_CONF_OFFSET,  
  11.     offsetof(ngx_http_push_stream_loc_conf_t, location_type),  
  12.     NULL },  


1.3.  模块上下文 
       静态的ngx_http_module_t结构体,包含一大坨函数引用,用来创建和合并三段配置 (main,server,location): 

C代码   收藏代码
  1. static ngx_http_module_t    ngx_http_push_stream_module_ctx = {  
  2.     NULL,                                       /* preconfiguration */  
  3.     ngx_http_push_stream_postconfig,            /* postconfiguration */  
  4.     ngx_http_push_stream_create_main_conf,      /* create main configuration */  
  5.     ngx_http_push_stream_init_main_conf,        /* init main configuration */  
  6.     NULL,                                       /* create server configuration */  
  7.     NULL,                                       /* merge server configuration */  
  8.     ngx_http_push_stream_create_loc_conf,       /* create location configuration */  
  9.     ngx_http_push_stream_merge_loc_conf,        /* merge location configuration */  
  10. };  



1.4.  模块定义 

C代码   收藏代码
  1. ngx_module_t    ngx_http_push_stream_module = {  
  2.     NGX_MODULE_V1,  
  3.     &ngx_http_push_stream_module_ctx,           /* module context */  
  4.     ngx_http_push_stream_commands,              /* module directives */  
  5.     NGX_HTTP_MODULE,                            /* module type */  
  6.     NULL,                                       /* init master */  
  7.     ngx_http_push_stream_init_module,           /* init module */  
  8.     ngx_http_push_stream_init_worker,           /* init process */  
  9.     NULL,                                       /* init thread */  
  10.     NULL,                                       /* exit thread */  
  11.     ngx_http_push_stream_exit_worker,           /* exit process */  
  12.     ngx_http_push_stream_exit_master,           /* exit master */  
  13.     NGX_MODULE_V1_PADDING  
  14. };  


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

C代码   收藏代码
  1. static ngx_int_t  
  2. ngx_http_push_stream_init_module(ngx_cycle_t *cycle)  
  3. {  
  4.     ngx_core_conf_t                         *ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module  
  5. );  
  6.   
  7.     if ((ngx_http_push_stream_module_main_conf == NULL) || !ngx_http_push_stream_module_main_conf->enabled) {  
  8.         ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "ngx_http_push_stream_module will not be used with this configu  
  9. ration.");  
  10.         return NGX_OK;  
  11.     }  
  12.   
  13.     // initialize our little IPC  
  14.     return ngx_http_push_stream_init_ipc(cycle, ccf->worker_processes);  
  15. }  


代码很简单 

  • 获取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) 

 

转载于:https://www.cnblogs.com/xinyaoxp/p/3423542.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值