【Nginx】事件和连接
不同的操作系统相应不同的事件驱动机制。在Linux 2.6之后使用epoll机制。相应的事件驱动模块是ngx_epoll_module。Nginx的ngx_event_core_module模块依据操作系统确定使用哪一个事件驱动模块。
事件驱动模块在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);
// 每一个事件模块须要实现的10个抽象方法
ngx_event_actions_t actions;
} ngx_event_module_t; // 事件模块通用接口
// 每一个事件模块须要实现的10个方法
typedef struct
{
// 将一个事件加入到事件驱动机制
ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
// 将一个事件从事件驱动机制中删除
ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
// 启动一个事件,眼下没有调用这种方法
ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
// 禁用一个事件,眼下没有调用这种方法
ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
// 将一个连接加入到事件驱动机制中。连接上的读、写事件即被加入到了事件驱动机制中
ngx_int_t (*add_conn)(ngx_connection_t *c);
// 从事件驱动机制中删除一个连接的读、写事件
ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
// 暂无用
ngx_int_t (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);
// 处理事件的方法,由处理、分发核心函数ngx_process_events_and_timers调用
ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags);
// 初始化事件驱动模块
ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
// 事件驱动模块退出前调用的方法
void (*done)(ngx_cycle_t *cycle);
} ngx_event_actions_t;
typedef struct ngx_event_s ngx_event_t; // 代表事件的结构体
// 代表事件的结构体
struct ngx_event_s {
...
ngx_event_handler_pt handler; // 核心,事件消费函数,定义怎样处理事件
...
};
struct ngx_cycle_s {
...
ngx_connection_t *connections; // 保存当前进程中全部的连接
ngx_event_t *read_events; // 保存全部的读事件
ngx_event_t *write_events; // 保存全部的写事件
...
};
- ngx_handle_read_event:将读事件加入到事件驱动模块(epoll)中。
- ngx_handle_write_event:将写事件加入到事件驱动模块(epoll)中。
- 连接上出现可读/可写事件
- epoll机制捕获到这一事件后返回
- 连接所相应的读/写事件结构体中的handler函数被调用
- ngx_connection_t:被动连接。
由client主动发起。
- ngx_peer_connection_t:主动连接。用于主动和上游server进行通信。
// 表示一个连接的结构体
struct ngx_connection_s {
void *data; // 连接未使用时,充当next指针连接池中下一个空暇的连接,当被使用时,是详细情况而定
ngx_event_t *read; // 连接相应的读事件
ngx_event_t *write; // 连接相应的写事件
ngx_socket_t fd; // 套接字描写叙述符
ngx_recv_pt recv; // 接收方法1
ngx_send_pt send; // 发送方法1
ngx_recv_chain_pt recv_chain; // 接收方法2
ngx_send_chain_pt send_chain; // 发送方法2
ngx_listening_t *listening; // 连接相应的监听对象
off_t sent; // 已发出去的字节数
ngx_log_t *log;
ngx_pool_t *pool; // 内存池
struct sockaddr *sockaddr; // 保存网络地址
socklen_t socklen; // 网络地址长度
ngx_str_t addr_text; // clientIP地址
ngx_str_t proxy_protocol_addr;
struct sockaddr *local_sockaddr; // 本机所监听的网络地址
socklen_t local_socklen; // 网络地址长度
ngx_buf_t *buffer; // 接收buffer
...
};
注意,上图左側的队列在物理存储上是连续存储的,也就是数组,而空暇链表是一条逻辑上的链表(通过data成员相连)用于管理空暇连接。数组的大小由配置文件里的配置项决定。上面说过,一个连接相应一个读事件和一个写事件,从上图能够看出,同样下标的连接和事件相互关联。
- ngx_get_connection:获取连接。也就是得到一个ngx_connection_t结构体实体。
- ngx_free_connection:归还连接。
【Nginx】事件和连接的更多相关文章
- 【Nginx】Nginx事件模块
一.事件处理框架概述 事件处理框架所要解决的问题是如何收集.管理.分发事件.事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主.事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制 ...
- Nginx事件管理之epoll模块
1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...
- Nginx事件管理之概念描述
1. Nginx事件管理概述 首先,Nginx定义了一个核心模块ngx_events_module,这样在Nginx启动时会调用ngx_init_cycle方法解析配置项,一旦在 nginx.conf ...
- 10.6 Nginx 高并发连接
Nginx 高并发连接 什么是IO,输入输出 Web服务器IO的整个详细过程 (1)客户发起请求到服务器网卡: (2)服务器网卡接受到请求后转交给内核 ...
- 低功耗蓝牙BLE之连接事件、连接参数和更新方法
转自:http://blog.csdn.net/zzfenglin/article/details/51304084 连接事件 在一个连接当中,主设备会在每个连接事件里向从设备发送数据包.一个连接事件 ...
- Jquery事件的连接
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Nginx 限制并发连接和并发请求数配置
Nginx限制并发连接和并发请求数配置 by:授客 QQ:1033553122 测试环境 nginx-1.10.0 配置介绍 查看是否内置模块 # pwd /mnt/nginx-1.10.0 ...
- Nginx 事件基本处理流程分析
说明:本文章重点关注事件处理模型.有兴趣的同学可以去http://tengine.taobao.org/book/查找更多资料.Tengine应该是淘宝基于Nginx自己做的修改.这个地址的文档还在不 ...
- Nginx:事件模块
参考资料<深入理解Nginx> 根据不同的系统内核,Nginx会使用不同的事件驱动机制,本次描述的场景是使用epoll来驱动事件的处理. epoll的使用方法 1.int epoll_cr ...
随机推荐
- java语句与流程控制
java程序结构按照结构化程序的思想分为顺序结构,选择结构,和循环结构. ①选择语句 选择结构分为单选择,双选择和多选择.双选择是标准的选择结构,单选择是双选择的简化形式,多选择是双选择的嵌套形式. ...
- 新手们的GDI+绘制方格
//绘制panel控件触发的事件 //不可在窗体加载时绘制方格 private void panel1_Paint(object sender, PaintEventArgs e) ...
- .Net HttpClient 模拟登录微信公众平台发送消息
1.模拟登录 public WeiXinRetInfo ExecLogin(string name, string pass) { CookieContainer cc = new CookieCon ...
- uva 260 - Il Gioco dell'X
题解: 一定有人获胜,非黑即白:获胜条件为:black是由 上走到下,white是由 左走到右: #include <cstdio> using namespace std; int N; ...
- 利用css进行网页布局
网页布局: 又称版式布局,是网页UI设计师将有限的视觉元素进行有机的排列组合,将理性的思维个性的化的表现出来,是一种具有个人艺术特色的视觉传达方式.传达信息的同时有美感.网页设计特点(相对纸媒来说). ...
- IIS下 Yii Url重写
下载URL重写组件 http://www.microsoft.com/zh-cn/download/details.aspx?id=7435 导入官方提供的.htaccess文件 Options +F ...
- Arduino 板子 COM 接口找不到设备
复位 Arduino 板子 1.打开官方的blink程序. 2.重新拔插usb. 3.点下载. 4.按住左上角的复位按键不放. 5.等显示开始下载瞬间松开按键.把握住那个瞬间. 6.多试验几次看能 ...
- pyqt5猜数游戏
电脑随机生成4个互不相等的数,你猜. 1:你猜的数和正确答案相比,位置正确的个数 2:你猜的数虽然在正确答案中,但位置不对,它的个数. 代码如下: #!/usr/bin/env python # -* ...
- Visual studio 内存不足的解决方案(out of memory)
编译Visual Studio项目,如果出现"out of memory "的编译错误,可以进行如下操作,加大应用程序可以使用的内存. 请先备份好系统和设置好系统还原点,大体步骤是 ...
- iOS中使用ZipArchive压缩和解压缩文件-备
为什么我需要解压缩文件 有许多原因能解释为什么我要在工程中使用压缩和解压缩功能,下面是几个常见的原因: 苹果App Store的50M下载限制 苹 果公司出于流量的考虑,规定在非WIFI环境下,限制用 ...