1. ngx_events_module核心模块的功能介绍

ngx_events_module 模式是一个核心模块,它的功能如下:

  • 定义新的事件类型
  • 定义每个事件模块都需要实现的ngx_event_module_t接口
  • 管理这些事件模块生成的配置项结构体,并解析事件类配置项,同时,在解析配置项时会调用其在ngx_command_t数组中定义的配置项结构体.

2. ngx_events_module的框架实现

2.1 ngx_events_module的配置项

static ngx_command_t  ngx_events_commands[] = {

    { ngx_string("events"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_events_block,
0,
0,
NULL }, ngx_null_command
};

ngx_events_module 模块只对一个块配置项感兴趣,也就是 nginx.conf 中必须有的 events{} 配置项。

2.2 核心模块的通用接口

static ngx_core_module_t  ngx_events_module_ctx = {
ngx_string("events"),
NULL,
ngx_event_init_conf
};

这里,ngx_events_module_ctx 只是实现了init_conf方法,而没有实现create_conf方法,这是因为ngx_events_module模块

并不会解析配置项的参数,只是在出现 "events" 配置项后会调用各事件模块去解析 events{} 块内的配置项。init_conf方

法仅是检测是否能获取到ngx_events_module模块的保存在cycle->conf_ctx数组中的配置项结构体,该结构体保存着所有事件

模块的配置项。

static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
{
if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
"no \"events\" section in configuration");
return NGX_CONF_ERROR;
} return NGX_CONF_OK;
}

2.3 模块的定义

ngx_module_t  ngx_events_module = {
NGX_MODULE_V1,
&ngx_events_module_ctx, /* module context */
ngx_events_commands, /* module directives */
NGX_CORE_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};

从这可以看出,ngx_events_module模块除了对 events 配置项的解析外,没有做其他任何事情。

3. ngx_events_module的配置项管理

3.1 如何管理所有事件模块的配置项

每一个事件模块都必须实现ngx_event_module_t接口,这个接口中允许每个事件模块建立自己的配置项结构体,用于存储自己

感兴趣的配置项在nginx.conf中对应的参数。ngx_event_module_t 中的 create_conf 方法就是用于创建这个结构体的方法,

事件模块只需要在这个方法中分配内存即可。

每一个事件模块产生的配置结构体指针都会被放到 ngx_events_module 模块创建的指针数组中。而 ngx_cycle_t 核心结构体

中的 conf_ctx 成员,它指向一个指针数组,这个指针数组中就依次存放着所有的 Nginx 模块关于配置项方面的指针。因

此,核心模块 ngx_events_module 管理所有事件模块的总配置项结构体就按 ngx_events_module 模块在全部 Nginx 模块中

的排序号放入到 ngx_cycle_t 核心结构体的成员 conf_ctx 指针数组中的对应下标处。

ngx_cycle_t 结构体中 conf_ctx 的结构示意图

3.2 ngx_events_block

static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
char *rv;
void ***ctx;
ngx_uint_t i;
ngx_conf_t pcf;
ngx_event_module_t *m; /* 检测配置项结构体是否已经存在 */
if (*(void **) conf) {
return "is duplicate";
} /* count the number of the event modules and set up their indices */ /* 计算出编译进 Nginx 的所有事件模块的总个数 */
ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE); /* 创建该核心事件存储所有事件模块的总配置项结构体指针 */
ctx = ngx_pcalloc(cf->pool, sizeof(void *));
if (ctx == NULL) {
return NGX_CONF_ERROR;
} /* 为每个事件模块都分配一个空间用于放置指向该事件模块的配置项结构体指针 */
*ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
if (*ctx == NULL) {
return NGX_CONF_ERROR;
} /* conf 其实就是核心模块 ngx_events_module 在 ngx_cycle_t 核心结构体的成员 conf_ctx 指针数组
* 相应位置的指针 */
*(void **) conf = ctx; /* 调用所有事件模块的 create_conf 方法 */
for (i = 0; cf->cycle->modules[i]; i++) {
if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {
continue;
} m = cf->cycle->modules[i]->ctx; if (m->create_conf) {
(*ctx)[cf->cycle->modules[i]->ctx_index] =
m->create_conf(cf->cycle);
if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) {
return NGX_CONF_ERROR;
}
}
} pcf = *cf;
cf->ctx = ctx;
cf->module_type = NGX_EVENT_MODULE;
cf->cmd_type = NGX_EVENT_CONF; /* 开始解析 events{} 配置块 */
rv = ngx_conf_parse(cf, NULL); *cf = pcf; if (rv != NGX_CONF_OK) {
return rv;
} /* 解析配置项完成后,调用各事件模块的 init_conf 方法 */
for (i = 0; cf->cycle->modules[i]; i++) {
if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {
continue;
} m = cf->cycle->modules[i]->ctx; if (m->init_conf) {
rv = m->init_conf(cf->cycle,
(*ctx)[cf->cycle->modules[i]->ctx_index]);
if (rv != NGX_CONF_OK) {
return rv;
}
}
} return NGX_CONF_OK;
}

Nginx事件管理之核心模块ngx_events_module的更多相关文章

  1. Nginx事件管理之ngx_event_core_module模块

    1. 概述 ngx_event_core_module 模块是一个事件类型的模块,它在所有事件模块中的顺序是第一位.它主要完成以下两点任务: 创建连接池(包括读/写事件): 决定究竟使用哪些事件驱动机 ...

  2. Nginx事件管理之epoll模块

    1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...

  3. Nginx事件管理之概念描述

    1. Nginx事件管理概述 首先,Nginx定义了一个核心模块ngx_events_module,这样在Nginx启动时会调用ngx_init_cycle方法解析配置项,一旦在 nginx.conf ...

  4. 【Nginx】核心模块ngx_events_module

    核心模块ngx_events_module是一个专门用于管理事件模块的模块. 它的实现非常easy.以下是该模块的定义: ngx_module_t ngx_events_module = { NGX_ ...

  5. Backbone事件管理——Backbone.Events模块API结构

    模块Backbone.Events的事件管理是通过Backbone提供的Events API来实现的,该API在1.0版本之前仅仅提供了几个基本的方法,如on.off.trigger.once分别执行 ...

  6. Nginx事件管理之定时器事件

    1. 缓存时间 1.1 管理 Nginx 中的每个进程都会单独地管理当前时间.ngx_time_t 结构体是缓存时间变量的类型: typedef struct { /* 格林威治时间1970年1月1日 ...

  7. Nginx事件管理之事件处理流程

    1. 概述 事件处理要解决的两个问题: "惊群" 问题,即多个 worker 子进程监听相同端口时,在 accept 建立新连接时会有争抢,引发不必要的上下文切换, 增加系统开销. ...

  8. Nginx事件管理机制-epoll

    epoll的最大好处在于他不会随着被监控描述符的数目的增长而导致效率极致下降. select是遍历扫描来判断每个描述符是否有事件发生,当监控的描述付越多时,时间消耗就越多,并且由于系统的限制selec ...

  9. 【Nginx】Nginx事件模块

    一.事件处理框架概述 事件处理框架所要解决的问题是如何收集.管理.分发事件.事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主.事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制 ...

随机推荐

  1. 【Git的基本操作八】添加、提交、查看状态

    添加.提交.查看状态操作 查看状态: git status

  2. 配置Notepad++万能调试

    需求: 正常情况下 使用notepad++编辑修改一些网页或脚本文件,修改之后想要查看效果需要Ctrl+S保存,然后从文件目录中打开查看. 现在我想做的就是简化查看效果的流程,让notepad++实现 ...

  3. 币种大写算法(js)

    注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8: 思路一:小数变成整数(通过字符串处理),计算后,变成小数: 思 ...

  4. ORALCE 数据库字符串处理、常用函数

    .字符串转日期: to_date(paramStr,'YYYYMMDDHH24MISS') to_date(paramStr,'yyyy-MM-DD') to_date(paramStr,'yyyy/ ...

  5. 四、指定Nginx启动用户

    一.nginx指定启动用户 1.参考宝塔的配置 解释:(linux权限管理) 指定用www用户启动nginx,如果你用root启动nginx,万一nginx有漏洞,被提权了,你服务器就GG了 所以指定 ...

  6. python面向编程:面向对象、init、绑定方法、案例练习

    一.类的定义 二.面向对象概念三.对象的使用四.__init__函数的使用五.绑定方法六.面向对象联系 一.类的定义 1.什么叫做类? 类就是分类,类型的意思,一堆具备相同特征和行为的事物的抽象概念 ...

  7. QTP(1)

    一.概念 1.什么是软件测试? 使用人工或者自动手段来运行或者测试某个软件的过程,其目的在于检验程序是否满足需求规格说明书或者弄清实际结果与预期结果之间的差异. (1)软件(程序+文档+数据)测试 ( ...

  8. 博弈论BOSS

    基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_c ...

  9. Mysql 5.6主从同步配置

    主从同步,本质是利用数据库日志,将主库数据复制一份到从库,本质上是使用了数据复制技术. 本文概要 主库的基本配置 从库的基本配置 完全同步的步骤 注意事项 工作原理 1. 主库的基本配置 做两件事:启 ...

  10. BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)

    看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...