通过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源代码分析--事件模块 & 琐碎的更多相关文章

  1. Nginx源代码分析—业务流程

    Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...

  2. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  3. 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t

    nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  4. nginx源代码分析--进程间通信机制 & 同步机制

    Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...

  5. nginx源代码分析--nginx模块解析

    nginx的模块很之多.能够觉得全部代码都是以模块的形式组织.这包含核心模块和功能模块,针对不同的应用场合.并不是全部的功能模块都要被用到,附录A给出的是默认configure(即简单的httpser ...

  6. nginx源代码分析--读请求主体(1)

    首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...

  7. nginx源代码分析--配置文件解析

    ngx-conf-parsing 对 Nginx 配置文件的一些认识: 配置指令具有作用域,分为全局作用域和使用 {} 创建其他作用域. 同一作用域的不同的配置指令没有先后顺序:同一作用域能否使用同样 ...

  8. nginx源代码分析--event事件驱动初始化

    1.在nginx.c中设置每一个核心模块的index ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]-> ...

  9. nginx源代码分析之内存池实现原理

    建议看本文档时结合nginx源代码. 1.1   什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...

随机推荐

  1. CCF模拟题 最优配餐

    最优配餐 时间限制: 1.0s 内存限制: 256.0MB   问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在 ...

  2. RvmTranslator6.0 - AVEVA Marine Hull Model

    eryar@163.com 1. Introduction RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS) ...

  3. 最短路 spfa, dijkstra, Floyd

    spfa #include <stdio.h> #include <queue> using namespace std; #define RANGE 101 #define ...

  4. Android Studio 解决unspecified on project app resolves to an APK archive which is not supported

    出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation d ...

  5. Kinect 开发 —— 进阶指引(上)

    本文将会介绍一些第三方类库如何来帮助处理Kinect传感器提供的数据.使用不同的技术进行Kinect开发,可以发掘出Kinect应用的强大功能.另一方面如果不使用这些为了特定处理目的而开发的一些类库, ...

  6. Oracle primary key&foreign key

    --主键 alter table tablename1 add constraint pk_tablename1 primary key(column1);--增加数据表1的主键column1,如果是 ...

  7. Redis操作使用规范

    Windows 64位操作系统 Redis 安装包(当前教程版本2.8.12) 百度经验:jingyan.baidu.com 方法/步骤   1 在D盘新建文件夹[redis],右键解压Redis Z ...

  8. VMware Vsphere 6.0安装部署 vCenter Server安装

    几个不同的组件 vCenter Server:对ESXi主机进行集中管理的服务器端软件,安装在windows server 2008R2或以上的操作系统里,通过SQL 2008R2 或以上版本的数据库 ...

  9. metadata 和 routing

    虽然在刚开始源码概述时把代码分为分布式和数据两部分,但是它们的界限并不明显.之前这几篇可以说是这两部分的衔接.我们在快速接近数据(index)部分.本篇分析一下之前分析cluster遗留下的问题:Me ...

  10. Python 标准库 csv —— csv 文件的读写

    csv 文件,逗号分割文件. 0. 读取 csv 到 list from csv import reader def load_csv(csvfile): dataset = [] with open ...