nginx事件模块 -- 第一篇

微信公众号:郑尔多斯
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!

事件机制

下面是我们对nginx事件相关的配置,如下:

1events {2    worker_connections  1024;3    use epoll;4}

我们明确的使用了epoll机制,在nginx中,和事件相关的模块一共有三个,分别为ngx_events_modulengx_event_core_modulengx_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_modulecreate_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_modulengx_epoll_module,所以下一节我们详细介绍一下这两个事件模块。



喜欢本文的朋友们,欢迎长按下图关注订阅号郑尔多斯,更多精彩内容第一时间送达

郑尔多斯

原文地址:https://www.cnblogs.com/zhengerduosi/p/10122326.html

时间: 2024-08-29 12:20:57

nginx事件模块 -- 第一篇的相关文章

nginx事件模块 -- 第二篇

微信公众号:郑尔多斯关注可了解更多的Nginx知识.任何问题或建议,请公众号留言;关注公众号,有趣有内涵的文章第一时间送达! 事件机制 上一篇文件我们简单的介绍了ngx_event_block()函数的功能,这个函数用于解析events指令,引入事件机制.其实真正的工作是在ngx_event_core_module中完成的,这个模块可以解析use,work_connections等指令,这些指令用于控制nginx事件机制的一些参数.上一篇文章中我们也提到过执行ngx_event_block()函

Nginx 事件模块

概述 Nginx 是以事件的触发来驱动的,事件驱动模型主要包括事件收集.事件发送.事件处理(即事件管理)三部分.在Nginx 的工作进程中主要关注的事件是 IO 网络事件 和 定时器事件.在生成的 objs 目录文件中,其中ngx_modules.c 文件的内容是 Nginx 各种模块的执行顺序,我们可以从该文件的内容中看到事件模块的执行顺序为以下所示:注意:由于是在 Linux 系统下,所以支持具体的 epoll 事件模块,接下来的文章结构按照以下顺序来写. extern ngx_module

【Nginx】Nginx事件模块

一.事件处理框架概述 事件处理框架所要解决的问题是如何收集.管理.分发事件.事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制支持网络事件的处理. 步骤: 1.Nginx定义了一个核心模块ngx_events_module,该模块定义了事件类型的模块,为所有的事件模块解析events{}中的配置项,同时管理这些事件模块存储配置项的结构体 2.Nginx定义了一个非常重要的事件模块ngx_event_core_module,这个模块会决定使用哪种事件驱动机制,以及如何管理事件 3.Ngin

nginx之旅第一篇:nginx下载安装、nginx配置文件详解、nginx默认网站

一.nginx下载安装 版本nginx 1.15.5 系统环境centos7.5(本机ip192.168.199.228) 关闭selinux 和防火墙firewall 1.下载 wget http://nginx.org/download/nginx-1.15.5.tar.gz -P /usr/src 2.安装 安装大概过程 配置---编译---安装 配置 1)检查环境 是否 满足安装条件 依赖解决 2)指定安装方式 配置文件 命令文件 各种文件放哪里 开启模块功能[内 置模块 三方模块] 3

nginx事件模块 -- 第五篇 epoll add

微信公众号:郑尔多斯关注可了解更多的Nginx知识.任何问题或建议,请公众号留言;关注公众号,有趣有内涵的文章第一时间送达! 内容回顾 上一篇文章我们介绍了Nginx的epoll初始化过程.从这一篇文章开始我们继续介绍ngx_epoll_module的源码,包括添加事件,删除事件,触发事件等. ngx_epoll_module_ctx源码 1static ngx_event_module_t  ngx_epoll_module_ctx = { 2    &epoll_name, 3    ngx

nginx事件模块指令

accept_mutex Syntax: accept_mutex [ on | off ] Default: on nginx 使用连接互斥锁进行顺序的accept()系统调用. accept_mutex_delay Syntax: accept_mutex_delay Nms; Default: 500ms 如果一个进程没有互斥锁,它将延迟至少多长时间.默认情况下,延迟是500ms . debug_connection Syntax: debug_connection [ip | CIDR]

CC3200模块第一篇之-wlan_ap例程测试

1. cc3200主时钟80M,内部没有flash,必须外接SPI Flash.本次测试采用利尔达科技的CC3200的底板和模块(左边).烧写连接VCC, GND, RXD, TXD, SOP2, RST这6根线即可完成下载. 2. 使用IAR工具打开工程,看下main代码,其中VStartSimpleLinkSpawnTask这个函数搞不明白是什么?SimpleLink是TI注册的一个商标,CC3200是CC3200SimpleLink?Wi-Fi 1 void main() 2 { 3 lo

nginx学习笔记五(nginx的事件模块定义)

在linux后台服务器开发领域里面,epoll的大名是早有所闻.<深入理解nginx>一书在第9章-事件模块中就详细说明了epoll相关的系统调用是怎么嵌入到nginx的框架中. 下面说明nginx框架下与事件处理相关的一些模块. 一.ngx_events_module ngx_events_module是核心模块中的一种.之前一直不是很明白核心模块的意思,现在想来,事件模块的核心模块应该是第一个启动的与事件相关的模块.这个模块并不会去处理实际的事件业务,而是会去做一些基本的初始化操作.ngx

nginx源码分析--事件模块 &amp; 琐碎

通过HUP信息使得NGINX实现重新读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外所有的模块都是ngx_module_t类型,这个结构体作为所有模块的通用接口,它只定义了init_master.init_module.init_process.init_thread.exit_thread.exit_process.exit_master这7个回调方法,(其实init_master.init_thread.exit_thread这3个方法目前都没有