微信公众号:郑尔多斯
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
事件机制
下面是我们对nginx事件相关的配置,如下:
1events {2 worker_connections 1024;3 use epoll;4}
我们明确的使用了epoll机制,在nginx中,和事件相关的模块一共有三个,分别为ngx_events_module
,ngx_event_core_module
,ngx_epoll_module
。
本篇文章介绍ngx_events_module
模块。
ngx_events_module
该模块是nginx中引入事件机制的模块,我们可以从ngx_events.c
文件中找到与ngx_events_module
相关的配置,如下:
1static ngx_command_t ngx_events_commands[] = { 2 3 { ngx_string("events"), 4 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS, 5 ngx_events_block, 6 0, 7 0, 8 NULL }, 910 ngx_null_command11};121314static ngx_core_module_t ngx_events_module_ctx = {15 ngx_string("events"),16 NULL,17 ngx_event_init_conf18};192021ngx_module_t ngx_events_module = {22 NGX_MODULE_V1,23 &ngx_events_module_ctx, /* module context */24 ngx_events_commands, /* module directives */25 NGX_CORE_MODULE, /* module type */26 NULL, /* init master */27 NULL, /* init module */28 NULL, /* init process */29 NULL, /* init thread */30 NULL, /* exit thread */31 NULL, /* exit process */32 NULL, /* exit master */33 NGX_MODULE_V1_PADDING34};3536typedef struct {37 ngx_str_t name;38 void *(*create_conf)(ngx_cycle_t *cycle);39 char *(*init_conf)(ngx_cycle_t *cycle, void *conf);40} ngx_core_module_t;
从上面的配置中我们可以得到如下信息:
ngx_events_module
是一个核心模块 (NGX_CORE_MODULE
类型)ngx_events_module
只解析一个命令,即events
这个NGX_BLOCK
命令,并且不带参数ngx_events_module
的create_conf()
函数为空,它只有init_conf()
函数- 当遇到
events
指令的时候,调用ngx_event_block()
函数进行解析处理
解析events指令
我们在前面的文章中介绍过,配置文件的解析是在ngx_init_cycle()
函数中完成的。我们再次把这部分代码摘出来,如下:
1cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));2 if (cycle->conf_ctx == NULL) {3 ngx_destroy_pool(pool);4 return NULL;5 }
这里分配conf_ctx
的内存空间,然后执行如下的代码:
1for (i = 0; cycle->modules[i]; i++) { 2 if (cycle->modules[i]->type != NGX_CORE_MODULE) { 3 continue; 4 } 5 6 module = cycle->modules[i]->ctx; 7 8 if (module->create_conf) { 9 rv = module->create_conf(cycle);10 if (rv == NULL) {11 ngx_destroy_pool(pool);12 return NULL;13 }14 cycle->conf_ctx[cycle->modules[i]->index] = rv;15 }16 }
遍历所有的NGX_CORE_MODULE
类型的模块,调用他们的create_conf()
方法,并且赋值给cycle->conf_ctx
,上面分析过,ngx_event_module
并没有create_conf()
方法,所以这部分代码对ngx_event_module
没有影响。
ngx_events_block
下面我么分析一下ngx_events_block()
函数,这个函数的作用就是解析events
指令,代码如下:
1static char * 2ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) 3{ 4 char *rv; 5 void ***ctx; 6 ngx_uint_t i; 7 ngx_conf_t pcf; 8 ngx_event_module_t *m; 910 if (*(void **) conf) {11 return "is duplicate";12 }1314 /* count the number of the event modules and set up their indices */1516 ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE);1718 ctx = ngx_pcalloc(cf->pool, sizeof(void *));19 if (ctx == NULL) {20 return NGX_CONF_ERROR;21 }2223 *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));24 if (*ctx == NULL) {25 return NGX_CONF_ERROR;26 }2728 *(void **) conf = ctx;2930 for (i = 0; cf->cycle->modules[i]; i++) {31 if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {32 continue;33 }3435 m = cf->cycle->modules[i]->ctx;3637 if (m->create_conf) {38 (*ctx)[cf->cycle->modules[i]->ctx_index] =39 m->create_conf(cf->cycle);40 if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) {41 return NGX_CONF_ERROR;42 }43 }44 }4546 pcf = *cf;47 cf->ctx = ctx;48 cf->module_type = NGX_EVENT_MODULE;49 cf->cmd_type = NGX_EVENT_CONF;5051 rv = ngx_conf_parse(cf, NULL);5253 *cf = pcf;5455 if (rv != NGX_CONF_OK) {56 return rv;57 }5859 for (i = 0; cf->cycle->modules[i]; i++) {60 if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {61 continue;62 }6364 m = cf->cycle->modules[i]->ctx;6566 if (m->init_conf) {67 rv = m->init_conf(cf->cycle,68 (*ctx)[cf->cycle->modules[i]->ctx_index]);69 if (rv != NGX_CONF_OK) {70 return rv;71 }72 }73 }7475 return NGX_CONF_OK;76}
该函数的执行流程如下:
- 计算当前有多少个
NGX_EVENT_MODULE
类型的模块,我们这里的例子中有两个该类型的模块- 分配内存空间
- 调用所有
NGX_EVENT_MODULE
类型模块的create_conf()
方法- 递归解析
events
块指令的内部指令,比如use
,worker_connections
等指令- 调用所有
NGX_EVENT_MODULE
类型模块的init_conf()
方法
上面就是ngx_events_block()
方法的执行流程。这个方法很简单,因为牵涉到ngx_event_core_module
和 ngx_epoll_module
,所以下一节我们详细介绍一下这两个事件模块。
喜欢本文的朋友们,欢迎长按下图关注订阅号郑尔多斯,更多精彩内容第一时间送达
郑尔多斯
原文地址:https://www.cnblogs.com/zhengerduosi/p/10122326.html