【Nginx】Nginx事件模块
一、事件处理框架概述
事件处理框架所要解决的问题是如何收集、管理、分发事件。事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主。事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制(I/O多路复用)支持网络事件的处理。
步骤:
1.Nginx定义了一个核心模块ngx_events_module,该模块定义了事件类型的模块,为所有的事件模块解析events{}中的配置项,同时管理这些事件模块存储配置项的结构体
2.Nginx定义了一个非常重要的事件模块ngx_event_core_module,这个模块会决定使用哪种事件驱动机制,以及如何管理事件
3.Nginx定义了一系列(目前为9个)运行在不同操作系统、不同内核版本上的事件驱动模块。在ngx_event_module模块的初始化过程中,将会从以上9个模块中选取一个作为Nginx进程的事件驱动模块
事件模块:ngx_module_t表示Nginx模块的基本接口,而针对于每一种不同类型的模块,都有一个结构体来描述这一类模块的通用接口,这个接口保存在ngx_module_t结构体的ctx成员中。比如:事件模块的通用接口是ngx_event_module_t结构体。
typedef struct {
ngx_str_t *name;//事件模块的名称
void *(*create_conf)(ngx_cycle_t *cycle);//在解析配置项前,创建存储配置项参数的结构体
//在解析配置项完成后,综合处理当前事件模块感兴趣的全部配置项
char *(*init_conf)(ngx_cycle_t *cycle,void *conf);
ngx_event_actions_t action;//每个事件模块需要实现的十个抽象方法
}ngx_event_module_t;
ngx_event_module_t中的actions成员是定义事件驱动模块的核心方法。ngx_event_core_module和9个事件驱动模块都必须在ngx_module_t结构体的ctx成员中实现ngx_event_module_t接口。
二、Nginx事件的定义
在Nginx中,每一个事件都由ngx_event_t结构体来表示。每一个事件最核心的部分是handler回调方法,它将由每一个事件消费模块实现,用于处理事件。
typedef void (*ngx_event_handler_pt)(ngx_event_t *ev);
一般向epoll(事件驱动模块)中添加可读或可写事件时,都是使用ngx_handle_read_event或者ngx_handle_write_event方法的。
ngx_int_t ngx_handle_read_event(ngx_event_t *rev,ngx_uint_t flags);
//rev是要操作的事件,flags将会指定事件的驱动方式
ngx_int_t ngx_handle_write_event(ngx_event_t *wev,size_t lowat);
//wev是要操作的事件,lowat表示只有当连接对应的套接字缓冲区中必须由lowat大小的可写空间时,事件收集器(如select或epoll_wait调用)才能处理这个可写事件。
三、Nginx连接的定义
作为Web服务器,每一个用户请求至少对应着一个TCP连接,为了处理这个连接,至少需要一个读事件和一个写事件,使得epoll可以有效地根据触发的事件调度相应模块读取请求或者发送响应。
ngx_connection_t:客户端主动发起的,Nginx服务器被动接受的TCP连接(被动连接)
ngx_peer_connection_t:nginx主动向其他上游服务器建立的连接
ngx_peer_connection_t主动连接是以ngx_connection_t结构体为基础实现的,这两种连接都不可以随意创建,必须从连接池中获取。
ngx_connection_t连接池:
在ngx_cycle_t中的connections和free_connections这两个成员构成了一个连接池,其中connections指向整个连接池数组的首部,而free_connections则指向第一个ngx_connection_t空闲连接。所有的空闲连接ngx_connection_t都以data成员作为next指针串联成一个单链表,如此,一旦有用户发起连接时就从free_connection指向的链表头获取一个空闲的连接,同时free_connection再指向下一个空闲连接,而归还连接时只需把该连接插入到free_connections链表表头即可。
事件池
Nginx中每一个连接一定需要一个读事件和一个写事件,有多少连接就分配多少个读写事件。由于读事件、写事件、连接池是由3个相同大小的数组组成,所以根据数组序号就可将每一个连接、读事件、写事件对应起来,这个对应关系在ngx_event_core_module模块的初始化过程中就已经决定。这三个数组的大小由nginx.conf中的connections配置项决定。
四、ngx_events_module核心模块
功能:定义新的事件类型,并定义每个事件模块都需要实现的ngx_event_module_t接口,还需要管理这些事件模块生成的配置项结构体,并解析事件类配置项,在解析配置项时会调用其在ngx_command_t数组中定义的回调方法。
ngx_events_commands数组决定了ngx_events_module模块是如何定制其功能的
static ngx_command_t ngx_events_conmmands[]={
{ngx_string("events"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_events_block,
0,
0,
NULL},
ngx_null_command
};
作为核心模块,ngx_events_module还需要实现核心模块的共同接口ngx_core_module_t
static ngx_core_module_t ngx_events_module_ctx={
ngx_string("events"),
NULL,
NULL
};
管理所有事件模块的配置项
每一个事件模块产生的配置结构体指针都会被放在ngx_events_module模块创建的指针数组中。
管理事件模块
截图待续
【Nginx】Nginx事件模块的更多相关文章
- Nginx -- nginx.conf 配置文件详讲
Nginx服务器配置,nginx.conf文件代码详讲,结合不同楼主的博文得到: #关掉访问日志可以优化服务器 #定义Nginx运行的用户和用户组 #user nobody; #nginx进程数 #如 ...
- nginx事件模块分析(一)
nginx ngx_events_module模块分析 ngx_events_module模块是核心模块之一,它是其它所有事件模块的代理模块.nginx在启动时只与events模块打交道,而由even ...
- 高性能Web服务器Nginx的配置与部署研究(8)核心模块之事件模块
一.事件模块的作用是什么? 用来设置Nginx处理链接请求. 二.相关指令 1. accept_mutex 含义:设置是否使用连接互斥锁进行顺序的accept()系统调用. 语法:accept_mut ...
- Nginx:事件模块
参考资料<深入理解Nginx> 根据不同的系统内核,Nginx会使用不同的事件驱动机制,本次描述的场景是使用epoll来驱动事件的处理. epoll的使用方法 1.int epoll_cr ...
- 【Nginx】ngx_event_core_module事件模块
功能:创建连接池,决定使用哪些事件驱动机制,以及初始化将要使用的事件模块 该模块定义了ngx_event_core_commands数组处理其感兴趣的7个配置项 ngx_event_conf_t为该模 ...
- nginx源代码分析--事件模块 & 琐碎
通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的 ...
- nginx日志模块、事件模块
日志模块 1.access_log指令 语法: access_log path [format [buffer=size [flush=time]]]; access_log logs/access. ...
- 【Nginx】事件和连接
不同的操作系统相应不同的事件驱动机制.在Linux 2.6之后使用epoll机制.相应的事件驱动模块是ngx_epoll_module.Nginx的ngx_event_core_module模块依据操 ...
- nginx源代码分析--模块分类
ngx-modules Nginx 基本的模块大致能够分为四类: handler – 协同完毕client请求的处理.产生响应数据.比方模块, ngx_http_rewrite_module, ngx ...
随机推荐
- C++虚析构函数的使用
如果,你设计的程序里,释放对象实例的时候,有“使用某个基类的指针,来释放它指向的派生类的实例”这种用法出现的话,那么,这个基类的destructor就应该设计成virtual的. 如果,基类不是vir ...
- sleep 和wait的差别
基本的差别 1.sleep 是Thread 类的方法,wait 是Object类中定义的方法 2.sleep()方法可以在任何地方使用 3.wait()方法只能在synchronized方法中使用,或 ...
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- html5新增的定时器requestAnimationFrame
在requestAnimationFrame出现之前,我们一般都用setTimeout和setInterval,那么html5为什么新增一个requestAnimationFrame,他的出现是为了解 ...
- hdu3404 Switch lights
题目描述 题解: 首先,由$SG$定理得SG(x,y)=mex(SG(x',y)^SG(x,y')^SG(x',y'))(x'<x,y'<y) 这里的$SG(x,y)$叫$Nim$积. $ ...
- selenium Select下拉框
先来认识一下下拉框,以百度的“高级设置”为例 介绍两种方法来处理下拉框:使用click事件,使用Select方法 使用click事件 上述下拉框的源代码如下: 虽然我们可以在html源文件中看到sel ...
- 8. Truncate undo表空间
8. Truncate undo表空间 要Truncate Undo 表空间,必须为MySQL实例配置至少两个undo表空间(两个undo表空间可确保一个undo表空间保持活动状态,另一个处于脱机状态 ...
- 关于在views对models创建的表的简单操作
models.User.objects.create(c1='a',c2='b') obj=models.User(c1='a',c2='b') obj.save() 增加 models.User.o ...
- 洛谷 1067 NOIP2009 普及组 多项式输出
[题解] 一道简单的模拟题.需要判一些特殊情况:第一项的正号不用输出,x的一次项不用输出指数,系数为0的项不用输出等等,稍微细心一下就好. #include<cstdio> #includ ...
- 算法导论 第六章 2 优先队列(python)
优先队列: 物理结构: 顺序表(典型的是数组){python用到list} 逻辑结构:似完全二叉树 使用的特点是:动态的排序..排序的元素会增加,减少#和快速排序对比 快速一次排完 增 ...