nginx源代码分析--事件模块 & 琐碎
通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级。
在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的通用接口。它仅仅定义了init_master、init_module、init_process、init_thread、exit_thread、exit_process、exit_master这7个回调方法,(事实上init_master、init_thread、exit_thread这3个方法眼下都没有使用),每个模块的这个7个方法何时回被调用。ngx_command_t类型的commands数组指定了模块处理配置项的方法。处理主要的就可以,ngx_module_t中的ctx成员还是一个void*指针,它能够指向不论什么数据,这给模块提供了非常大的灵活性。Ctx成员一般用户表示在不同类型的模块中一个类型模块所具备的通用性接口,比方对于不同类型的模块,ctx都是指向同一类型的模块,比方对于http模块,ctx指向的都是ngx_http_module_t类型,对于core模块,ctx指向的都是ngx_core_module_t类型,ctx的存在非常重要,使得对外同一的情况下出现错层次的模块形式。
对于核心、事件、HTTP、mail等4类模块的ctx上下文成员指向的类型分别为ngx_core_module_t、ngx_http_module_t、ngx_event_module_t、ngx_mail_conf_t类型。Ngx_module_t中的type说明当前模块是什么类型。当中配置类型模块是唯一一种仅仅有1个模块的模块类型。配置模块的类型叫做NGX_CONF_MODULE,仅有一个模块为ngx_conf_module,是其它模块的基础。
NGX_CORE_MODULE类型的模块,ngx_core_modulengx_errlog_module ngx_events_module ngx_openssl_module ngx_http_modulengx_mail_module这6个模块都是核心模块。全部核心模块的ctx指向ngx_core_module_t结构体。
作为一个核心模块都能够定义一个全新的模块类型。作为核心模块,ngx_events_module定义了NGX_EVENT_MODULE模块类型。全部事件类型的模块都由ngx_events_module核心模块管理。ngx_http_Module定义了NGX_HTTP_MODULE模块类型,多有HTTP类型的模块都由ngx_http_module核心模块管理;ngx_mail_module定义了NGX_MAIL_MODULE模块了性,多有MAIL类型的模块都由ngx_mail_module核心模块管理。
Ngxin中共同拥有5大模块类型:核心模块、配置模块、事件模块、HTTP模块、mail模块。
Nginx框架仅仅和前两种模块有关系。后面的三种模块在核心模块中都有自己的代言人。
配置类型的模块仅仅有一个模块,所以没有详细化ctx上下文成员。
5中模块中,配置模块与核心模块都是与Nginx框架密切相关的,是其它模块的基础。事件模块是HTTP和MAIL模块的基础,HTTP模块和MAIL模块的地位相似。在事件模块中。ngx_event_core_module事件模块是其它全部事件模块的基础,在HTTP模块中。ngx_http_core_module模块是其它全部HTTP模块的基础。在Mail模块中,ngx_mail_core_module模块是其它全部mail模块的基础。
所谓的事件驱动,即使有事件激发。然后又专门的时间收集分发器,有模块注冊自己感兴趣的事件。然后对应的模块消费自己感兴趣的模块
Nginx是全然的事件驱动架构业务,传统的webserver而言,事件驱动往往局限在TCP的建立关闭,关闭之前都不再是事件驱动了。
不管是master管理进程、worker进程、cache manager(loader)进程,每个进程都拥有唯一一个ngx_cycle_t结构体。
Nginx框架仅仅关心NGX_CORE_MODULE类型的模块。
Nginx中的Master进程关注7个全局标志 worker进程关注4个全局标志,master中的7个全局标志和对外的7个信号相关。8个标志位(当中一个是内部使用。和外部信号不相关)。ngx_reap ngx_terminate ngx_quit ngx_reconfigure ngx_restart(内部使用)ngx_reopen ngx_change_binary ngx_noaccept,决定不同的分支,每次一个循环运行结束就会被挂起。直到下一个信号到来,当ngx_reconfigure为1,将又一次初始化ngx_cycle_t结构体,然后重新启动一批进程,再给原来的进程发送信号使其优雅的死亡!
在ngx_init_cycle中仅仅关注核心模块,调用核心模块的create_conf和init_conf 在Main函数中再调用每一个模块的init_module函数。
事件结构体中的data指向ngx_connection_tngx_connection_t中的data 指向ngx_http_request_t
Nginx是在ET模式下工作 Muduo是在LT模式下工作。
一般向epoll中加入可读或者可写事件时,都是使用ngx_handle_read_event或者ngx_handle_write_event方法。
Nginx中定义了主要的数据结构ngx_connection_t来白哦是连接,这个连接白哦是是client主动发起的、nginxserver被动接受的TCP连接。在有些请求中。须要主动连接,比如在upstream机制中,nginx和后端server建立的连接,是nginx主动发的连接,这种连接于ngx_connection_t是不同的。nginx定义了ngx_peer_connection_t结构体表示主动连接。只是他也是以ngx_connectio_t为基础实现的。
Create_conf和init_conf是创建存储配置项參数的结构体和依据配置项来初始化配置项參数。每个事件模块都必须实现ngx_event_module_t接口,这个接口执行每个事件模块建立自己的配置项结构体,用于存储感兴趣的配置项在nginx.conf中相应的參数。
某一个模块对配置文件里的某个配置项感兴趣,是通过commands数组来看的。
Ngx_module_t结构体中的init_module和Init_process仅仅有一个模块实现了,即使事件模块的ngx_event_core_module.
Epoll默认情况下是LT模式。编程简单。能够处理堵塞和非堵塞套接字。ET模式的效率高,可是仅仅支持非堵塞套接字。
关于时间缓存更新的问题,在worker进程中,要么通过定时器触发,定时器触发就是设置了更新时间的精度,在配置文件里须要配置,要么就是通过epoll返回就更新一次时间。获取所失败,再隔一段时间去尝试获取。
在master进程中,通过外部信号的出发,在第一次信号被触发以后,就是定时器来进行更新时间缓存。
异步I/O时间和epoll_moudle相关联。
HTTP框架大致由1个核心模块(ngx_http_module)两个HTTP模块(ngx_http_core_module、ngx_http_upstream_module)组成。
全部的server虚拟主机会以散列表的数据结构组织起来。全部的Locatin表达式会以一个静态的二叉查找树组织起来。
对于每个HTTP模块,都必须实现ngx_http_module_t接口。
nginx源代码分析--事件模块 & 琐碎的更多相关文章
- Nginx源代码分析—业务流程
Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...
- nginx源代码分析--进程间通信机制 & 同步机制
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...
- nginx源代码分析--nginx模块解析
nginx的模块很之多.能够觉得全部代码都是以模块的形式组织.这包含核心模块和功能模块,针对不同的应用场合.并不是全部的功能模块都要被用到,附录A给出的是默认configure(即简单的httpser ...
- nginx源代码分析--读请求主体(1)
首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...
- nginx源代码分析--配置文件解析
ngx-conf-parsing 对 Nginx 配置文件的一些认识: 配置指令具有作用域,分为全局作用域和使用 {} 创建其他作用域. 同一作用域的不同的配置指令没有先后顺序:同一作用域能否使用同样 ...
- nginx源代码分析--event事件驱动初始化
1.在nginx.c中设置每一个核心模块的index ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]-> ...
- nginx源代码分析之内存池实现原理
建议看本文档时结合nginx源代码. 1.1 什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...
随机推荐
- CentOS桥接网卡配置
网桥方式配置步骤 1.增加网桥设备br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge B ...
- Nginx缩略图和Fastdfs整合以及image_filter配置,7点经验结论和5个参考资料
以下是7点经验结论和5个参考资料 1.Nginx单独配置缩略图与Nginx和Fastdfs模块整合,配置是不一样的. 非整合模式的配置,类似这样的: location ~* /(\d+)\.(jpg ...
- 树莓派 使用python来操作GPIO 控制LED灯
一.创建python驱动和控制GPIO 先新建一个文件夹用于放置脚本 mkdir python_gpio 进入文件夹内新建一个gpio_blink.py的脚本 cd python_gpio touch ...
- 洛谷 P1914 小书童——密码
P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...
- VM虚拟机全屏显示
在虚拟机中使用全屏界面会有更强的用户体验.在编辑该文章的时候就是在使用虚拟机windows2008 R2系统.我的笔记本是苹果双系统.虚拟机安装在win7 64位系统下 1.首先查看主机的屏幕分辨率 ...
- ZOJ 3690 & HDU 3658 (矩阵高速幂+公式递推)
ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...
- 绕过open_basedir读文件脚本
绕过open_basedir读文件脚本 2016年11月13日 01:28:21 阅读数:1221 参加了一场2016年的sycsec感觉又学到不少东西 废话不多说,首先啥是open_basedir? ...
- 设计模式之Build(生成者模式)
一.生成器模式的定义: 生成器模式也称为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF).在软件设计中,有时候面临着一个非常复杂的对象的创 ...
- android图像处理(3) 底片效果
这篇将讲到图片特效处理的底片效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理:将当前像素点的RGB值分别与255之差后的值作为当前点的RGB值. 例: ABC 求B点的底片效果: B.r ...
- 值得学习的CSS知识
这里零度给大家推荐几个值得学习的CSS技巧,能让你编写网页事半功倍!一.清除默认值 通常 padding 的默认值为 0,background-color 的默认值是 transparent.但是在不 ...