【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可见性机制的原理
基本概念 可见性 当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值. 内存屏障(Memory Barriers) 处理器的一组指令,用于实现对内存操作的顺序限制. 缓冲行 CPU告诉缓存 ...
- 深入浅出 RPC - 浅出篇
近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用.在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神 ...
- USB2.0速度识别
我们知道USB2.0向下兼容USB1.x,即高速2.0的hub能支持所有的速度类型的设备,而USB1.x的hub不能支持高速设备(High Speed Device).因此,如果高速设备挂到USB1. ...
- js-事件委托
事件委托一般用于动态生成的元素中使用,如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...
- (转)C# DateTime格式化大全
//c datetime 格式化 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2 ...
- atoi()、inet_addr()等函数 time.h文件
1.atoi() 原型:int atoi(const char *nptr); 函数说明:参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ...
- sql_autoload_register() 函数 和__autoload() 的区别
1:__autoload($class) 因为是一个函数,所以只能定义一次,使用多个会冲突报错;而 sql_autoload_register('function') 可定义多个,它有效地创建一个队列 ...
- php基础之一
php基础:1.php语言标记:<?php ?>2.输出语句:echo 'Hello','Hi'; //可输出多个字符串 print 'World'; // ...
- 模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...
- 数据挖掘-Python基本模块
1.numpy:基础模块,高效处理数据.提供数组支持 2.pandas:数据探索和数据分析 3.matplotlib:数据成图模块,解决数据可视化 4.scipy:支持数值计算,支持矩阵运算,提供高等 ...