nginx ngx_events_module模块分析

ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块。nginx在启动时只与events模块打交道,而由events模块来加载其它事件模块;这样做的一个好处就是在添加新的事件模块处理新增配置项时原有事件模块代码不需做任何改动。events模块功能非常简单,它只负责处理events配置项(由ngx_events_block函数处理)。ngx_events_block函数做三件事情:一、为其它事件模块创建存储配置项结构的指针数组,并调用其它事件模块的create_conf函数。二、调用ngx_conf_parse函数解析events配置块内的配置项。三、调用其它事件模块的init_conf函数。

ngx_events_block函数分析

  1. static char *
  2. ngx_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;
  9.  
  10. if (*(void **) conf) {
  11. return "is duplicate";
  12. }
  13.  
  14. /* count the number of the event modules and set up their indices */
  15.  
  16. /***找出所有事件模块,对其ctx_index进行编号***/
  17. ngx_event_max_module = 0;
  18. for (i = 0; ngx_modules[i]; i++) {
  19. if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
  20. continue;
  21. }
  22.  
  23. ngx_modules[i]->ctx_index = ngx_event_max_module++;
  24. }
  25.  
  26. ctx = ngx_pcalloc(cf->pool, sizeof(void *));
  27. if (ctx == NULL) {
  28. return NGX_CONF_ERROR;
  29. }
  30.  
  31. /***分配存储其它事件模块配置项结构的指针数组***/
  32. *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
  33. if (*ctx == NULL) {
  34. return NGX_CONF_ERROR;
  35. }
  36.  
  37. *(void **) conf = ctx;
  38.  
  39. /***调用其它事件模块的create_conf函数***/
  40. for (i = 0; ngx_modules[i]; i++) {
  41. if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
  42. continue;
  43. }
  44.  
  45. m = ngx_modules[i]->ctx;
  46.  
  47. if (m->create_conf) {
  48. (*ctx)[ngx_modules[i]->ctx_index] = m->create_conf(cf->cycle);
  49. if ((*ctx)[ngx_modules[i]->ctx_index] == NULL) {
  50. return NGX_CONF_ERROR;
  51. }
  52. }
  53. }
  54.  
  55. /***保存解析events配置项时的配置结构***/
  56. pcf = *cf;
  57. /***在解析events{}内的配置项时,需要用到上面创建的ctx指针数组***/
  58. cf->ctx = ctx;
  59. cf->module_type = NGX_EVENT_MODULE;
  60. cf->cmd_type = NGX_EVENT_CONF;
  61.  
  62. /***递归解析events {}内的配置项***/
  63. rv = ngx_conf_parse(cf, NULL);
  64.  
  65. /***恢复配置结构***/
  66. *cf = pcf;
  67.  
  68. if (rv != NGX_CONF_OK)
  69. return rv;
  70.  
  71. /***调用其它事件模块的init_conf函数***/
  72. for (i = 0; ngx_modules[i]; i++) {
  73. if (ngx_modules[i]->type != NGX_EVENT_MODULE) {
  74. continue;
  75. }
  76.  
  77. m = ngx_modules[i]->ctx;
  78.  
  79. if (m->init_conf) {
  80. rv = m->init_conf(cf->cycle, (*ctx)[ngx_modules[i]->ctx_index]);
  81. if (rv != NGX_CONF_OK) {
  82. return rv;
  83. }
  84. }
  85. }
  86.  
  87. return NGX_CONF_OK;
  88. }

nginx事件模块分析(一)的更多相关文章

  1. Nginx:事件模块

    参考资料<深入理解Nginx> 根据不同的系统内核,Nginx会使用不同的事件驱动机制,本次描述的场景是使用epoll来驱动事件的处理. epoll的使用方法 1.int epoll_cr ...

  2. 【Nginx】Nginx事件模块

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

  3. Nginx功能模块汇总

    主要文档 Nginx功能概述.为什么选择Nginx.Nginx安装.常见问题(FAQ).配置符号参考.调试 nginx.优化 Nginx.运行和控制Nginx 核心模块 Nginx事件模块.Nginx ...

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

    通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的 ...

  5. nginx源码分析——event模块

    源码:nginx 1.12.0   一.简介      nginx是一款非常受欢迎的软件,具备高性能.模块化可定制的良好特性.之前写了一篇nginx的http模块分析的文章,主要对http处理模块进行 ...

  6. 高性能Web服务器Nginx的配置与部署研究(8)核心模块之事件模块

    一.事件模块的作用是什么? 用来设置Nginx处理链接请求. 二.相关指令 1. accept_mutex 含义:设置是否使用连接互斥锁进行顺序的accept()系统调用. 语法:accept_mut ...

  7. Zepto事件模块源码分析

    Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...

  8. 【Nginx】ngx_event_core_module事件模块

    功能:创建连接池,决定使用哪些事件驱动机制,以及初始化将要使用的事件模块 该模块定义了ngx_event_core_commands数组处理其感兴趣的7个配置项 ngx_event_conf_t为该模 ...

  9. nginx日志模块、事件模块

    日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...

随机推荐

  1. php与ascii码

    首先 简单说一下历史,ascii码最开始是美国人搞出来的,用来干什么呢?我们知道,计算机只知道0和1,如果我们要计算机识别除了01之外的字符,例如 'a',我们要先告诉计算机‘1100001’就是'a ...

  2. 常用freemarker使用文档

    设置价格格式 <#setting number_format = "currency" /> <#assign price = 42 /> ${price} ...

  3. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  4. linux C学习笔记04--内存映射

    内存映射代码,打开一个文件与映射到内存中,对内存和文件的修改都会反映到文件中来,反之亦然,先贴代码,以后再完善: /****************************************** ...

  5. Couldn't resolve Mac Server "mymac"

    vs2015创建一个iphone app ,Couldn't resolve Mac Server “mymac” 伤.下班走人

  6. LightOJ 1285 - Drawing Simple Polygon (几何,极角排序)

    1285 - Drawing Simple Polygon   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  7. linux系统man命令用法和安装方法

    Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 代號 代表內容 1 使用者在shell中可以操作的指令或可 ...

  8. deep learning

    今天跑一个模型,程序都没变,就配置文件变了.但是总是很快就显示loss为nan. 检查配置文件还是不行,把其中loss改为0还是不行.最后搁置了一下,再回头对比一下电脑上的和服务器上的,发现一个配置文 ...

  9. wget的使用详解

    我在工作中, 经常下载遥感影像,每个影像都很大,使用普通的ftphelpe下载不太稳定,最终选择了linux下一款牛逼的下载工具wget,使用它的windows移植版本的.在此写此文,希望对和我一样保 ...

  10. [刘阳Java]_Java环境搭建_第2讲

    1.为什么搭建Java的环境 Java的程序语言不能独立在操作系统上运行 Java程序需要一个JVM(Java虚拟机)才能将程序员写好的Java程序运行在操作系统 Java程序的跨平台(Mac, Li ...