【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 ...
随机推荐
- 模块计算机类型“X64”与目标计算机类型“x86”冲突
问题描述:在X64 平台上开发dll 文件,在生成dll时Vs 2010 出现如下错误 :"fatal error LNK1112: 模块计算机类型"X64"与目标计算机 ...
- Docker远程访问get(root)shell姿势
0x00 概述 在用swarm来管理dockers容器集群时默认开启了2375端口,通过远程访问docker run -H tcp://ip:2375 $command 可任意执行docker命令.这 ...
- ibatis中的resultClass,parameterClass,resultMap,resultType的使用与区别
parameterClass 是参数类.指定了参数的完整类名(包括包路径).可通过别名避免每次重复书写冗长的类名. resultClass 是结果类, 二.resultClass取值 1.result ...
- css属性之vertical-align详解
inline-block 该值会让元素生成一个内联级块容器(inline-level block container).一个inline-block的内部会被格式化成一个块盒,而该元素本身会被格式化成 ...
- 去除html页面中按钮在ios中的默认样式,去除select自带的小三角图标
btn{-webkit-appearance: none;} -webkit-appearance: none也能去掉select下拉列表后面自带的小三角
- sql练习总结(一)
最近在学sql,遇到了这么一道题: 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的. 把所能想到的实现方法都做了一遍: 1.用 ...
- Code First研究学习2_基本的错误及解决方法
使用Code First时总有很多的问题出现,以下列举了一些基本的错误及解决方法! 1.当用Enable-Migrations启动数据库迁移后,如果再继续输入Enable-Migrations命令,则 ...
- java下管道流 PipedOutputStream 与PipedInputStream
package cn.stat.p2.demo; import java.io.IOException; import java.io.PipedInputStream; import java.io ...
- 关于ROW_NUMBER函数的使用(The use of ROW_NUMBER function )
1.用于删除重复记录(The use of to delete the common record) 例子:(Example) #1初始化数据(Initialize the data) CREATE ...
- FileOutputStream
OutputStream: FileOutputStream BufferedOutputStream 缓冲输出流 package file; import java.io.File; import ...