Nginx 的 epoll 事件驱动模块

概述

在前面的文章中《Nginx 事件模块》介绍了Nginx 的事件驱动框架以及不同类型事件驱动模块的管理。本节基于前面的知识,简单介绍下在Linux 系统下的 epoll 事件驱动模块。关于 epoll 的使用与原理可以参照文章 《epoll 解析》。在这里直接介绍Nginx 服务器基于事件驱动框架实现的epoll 事件驱动模块。

ngx_epoll_module 事件驱动模块

ngx_epoll_conf_t 结构体

ngx_epoll_conf_t 结构体是保存ngx_epoll_module 事件驱动模块的配置项结构。该结构体在文件src/event/modules/ngx_epoll_module.c 中定义:


typedef struct {
    ngx_uint_t  events;         
    ngx_uint_t  aio_requests;   
} ngx_epoll_conf_t;

ngx_epoll_module 事件驱动模块的定义

所有模块的定义都是基于模块通用接口 ngx_module_t 结构,ngx_epoll_module 模块在文件src/event/modules/ngx_epoll_module.c 中定义如下:


ngx_module_t  ngx_epoll_module = {
    NGX_MODULE_V1,
    &ngx_epoll_module_ctx,               
    ngx_epoll_commands,                  
    NGX_EVENT_MODULE,                    
    NULL,                                
    NULL,                                
    NULL,                                
    NULL,                                
    NULL,                                
    NULL,                                
    NULL,                                
    NGX_MODULE_V1_PADDING
};

在 ngx_epoll_module 模块的定义中,其中定义了该模块感兴趣的配置项ngx_epoll_commands 数组,该配置项数组在文件src/event/modules/ngx_epoll_module.c 中定义:

在 ngx_epoll_module 模块的定义中,定义了该模块的上下文结构ngx_epoll_module_ctx,该上下文结构是基于事件模块的通用接口ngx_event_module_t 结构来定义的。该上下文结构在文件src/event/modules/ngx_epoll_module.c 中定义:

在 ngx_epoll_module 模块的上下文事件接口结构中,重点定义了ngx_event_actions_t 结构中的接口回调方法。

ngx_epoll_module 事件驱动模块的操作

ngx_epoll_module 模块的操作由ngx_epoll_module 模块的上下文事件接口结构中成员actions 实现。该成员实现的方法如下所示:

ngx_epoll_module 模块的初始化

ngx_epoll_module 模块的初始化由函数ngx_epoll_init 实现。该函数主要做了两件事:创建epoll 对象 和 创建 event_list 数组(调用epoll_wait 函数时用于存储从内核复制的已就绪的事件);该函数在文件src/event/modules/ngx_epoll_module.c 中定义:

ngx_epoll_module 模块的事件处理

ngx_epoll_module 模块的事件处理由函数ngx_epoll_process_events 实现。ngx_epoll_process_events 函数是实现事件收集、事件发送的接口。该函数在文件src/event/modules/ngx_epoll_module.c 中定义:

ngx_epoll_module 模块的事件添加与删除

ngx_epoll_module 模块的事件添加与删除分别由函数ngx_epoll_add_event 与ngx_epoll_del_event 实现。这两个函数的实现都是通过调用epoll_ctl 函数。具体实现在文件 src/event/modules/ngx_epoll_module.c 中定义:

ngx_epoll_module 模块的连接添加与删除

ngx_epoll_module 模块的连接添加与删除分别由函数ngx_epoll_add_connection 与ngx_epoll_del_connection 实现。这两个函数的实现都是通过调用epoll_ctl 函数。具体实现在文件 src/event/modules/ngx_epoll_module.c 中定义:

ngx_epoll_module 模块的异步 I/O

在 Nginx 中,文件异步 I/O 事件完成后的通知是集成到 epoll 对象中。该模块的文件异步I/O 实现如下:

参考资料:

《深入理解Nginx》

模块ngx_epoll_module详解

nginx epoll详解

Nginx源码分析-Epoll模块

关于ngx_epoll_add_event的一些解释

Last updated

Was this helpful?