前言
如果接着上两篇笔记走的话,现在就应该说worker循环工作中的核心处理方法ngx_process_events_and_timers()。但是在看这个功能函数之前,需要先学习相关的事件模块内容。这一块也算是我学习Nginx的核心了,里面有许多比较有趣的内容,比如常见的负载均衡,“惊群”现象等等。当然,最想学习的还是Nginx中关于epoll事件驱动机制了。
事件处理框架
Nginx事件处理框架主要围绕两种事件进行,分别是是网络事件以及定时器事件。其中,网络事件主要就是以TCP事件为主了。Nginx的高可移植性决定了它能够在不同的操作系统内核中选择符合的事件驱动机制支持网络事件的处理。Nginx支持的事件驱动机制可以看《笔记十一》中的模块间关系图。
那Nginx的事件处理框架又是如何选择事件驱动机制的呢?
1) Nginx定义了一个核心模块ngx_events_module,在Nginx启动时调用ngx_init_cycle方法解析配置项,找到"events{}"配置项后,ngx_events_module模块即开始工作。它的主要工作就是为所有的事件模块解析"events{}"中的配置项,同时管理这些事件模块存储配置项的结构体;
2) Nginx定义了一个非常重要的事件模块ngx_event_core_module,该模块决定使用哪种事件驱动机制,以及如何管理事件(后续笔记详细介绍);
3) Nginx定义了一系列运行在不同操作系统、不同内核版本上的事件驱动机制,包括:ngx_epoll_module、ngx_kqueue_module、ngx_poll_module、ngx_select_module、ngx_devpoll_module、ngx_eventport_module、ngx_aio_module、ngx_rtsig_module和基于Windows的ngx_kqueue_module模块。在ngx_event_core_module模块中,将会从以上9个模块中选择1个作为Nginx进程的事件驱动模块。
事件模块结构
事件模块是一种新的模块类型,它的通用接口是ngx_even