【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 ...
随机推荐
- C#文件的拆分与合并操作示例
C#文件的拆分与合并操作示例代码. 全局变量定义 ;//文件大小 //拆分.合并的文件数 int count; FileInfo splitFile; string splitFliePath; Fi ...
- C#如何判断质数(转)
要求:重复让用户输入输入一个数,判断该数是否质数,当输入“q”时,程序运行结束!(质数的判断要求用方法来实现). class Program { static void Main(string[] a ...
- String.PadLeft - 格式对齐
语法:public string PadLeft( int totalWidth, char paddingChar ) 概述,实现的效果是右对齐,返回一个总长度为 totalWidth,如果实际长度 ...
- javascript "非法值"检验.
<script type="text/javascript"> function getCoord() { var x = document.getElementByI ...
- How to start the Virtualbox VMs under terminal
Since we have servral machine on my testbed(fedora), and if I need start some VMs on that, I have to ...
- iOS_SN_LLDB常用命令
有一次因为封装一个控件,UI能正常显示就是不能点击,一点击就崩溃,而且异常断点也无法捕捉,把Xcode的僵尸对象打开,每次崩溃就打印一个地址,最后就必须根据地址寻找对象,可以使用frame varia ...
- 报错:/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/UITableView.m:7943解决方法
环境:Xcode7.1.1 详细错误: *** Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], ...
- (四)backbone - DEMO - 通信录
DEMO介绍 是DEMO - User List 的扩展,增加查询 大体实现 •创建Contact Model var Contact = Backbone.Model.extend({ defaul ...
- jQuery学习资源参考教程网址推荐
jQuery官方主页:http://jquery.comjQuery中文入门指南:http://www.k99k.com/jQuery_getting_started.htmljQuery使用手册:h ...
- js获取下拉列表(select)选中项的值和文本
获取下拉列表选中项的值和文本(select) <html> <head> <meta charset="utf-8"/> <title&g ...