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是完全的事件驱动架构业务,传统的web服务器而言,事件驱动往往局限在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来白哦是连接,这个连接白哦是是客户端主动发起的、nginx服务器被动接受的TCP连接,在有些请求中,需要主动连接,例如在upstream机制中,nginx和后端服务器建立的连接,是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接口。

时间: 2024-10-06 16:26:40

nginx源码分析--事件模块 & 琐碎的相关文章

nginx源码分析之模块初始化

在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要通过结合源码来分析模块的初始化过程. 稍微了解nginx的人都知道nginx是高度模块化的,各个功能都封装在模块中,而各个模块的初始化则是根据配置文件来进行的,下面我们会看到nginx边解析配置文件中的指令,边初始化指令所属的模块,指令其实就是指示怎样初始化模块的. 模块初始化框架 模块的初始化主要

nginx源码分析——event模块

源码:nginx 1.12.0 一.简介 nginx是一款非常受欢迎的软件,具备高性能.模块化可定制的良好特性.之前写了一篇nginx的http模块分析的文章,主要对http处理模块进行了分析讲解,同时也涉及了nginx模块化的内容.至于nginx高性能的原因,希望能够在在这篇文章中就自己对于这方面的理解给大家分享一下. nginx的event处理模型包含两个方面:高效的IO处理函数,事件的异步处理(可选的线程池). 二.IO复用函数 nginx中包含epoll.poll.select.devp

nginx源码分析——http模块

     源码:nginx 1.12.0   一.nginx http模块简介 由于nginx的性能优势,现在已经有越来越多的单位.个人采用nginx或者openresty.tengine等衍生版来作为WEB服务器.负载均衡服务器.安全网关来使用.在这些场景下,依赖的就是nginx的http模块,nginx的设计者采用模块化的设计思路,允许用户在http请求处理的各个阶段添加自己设计的模块来实现自己的一些逻辑,扩充一些功能. 二.http模块功能介绍 http模块的丰富功能其实是由一个个http

Nginx源码分析--epoll模块

Nginx采用epoll模块实现高并发的网络编程,现在对Nginx的epoll模块进行分析. 定义在src/event/modules/ngx_epoll_module.c中 1. epoll_create. int epoll_create(int size); 创建一个epoll的文件描述符,参数size告诉内核这个监听的数目共有多大. 2. epoll_ctl. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *even

Nginx源码分析—架构设计思想

Nginx源码分析-架构设计思想 我任务nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx. 至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩子函数,这里又设计到了nginx结构体的使用,比如所有的模块都是ngx_module_t这个结构体,但是这个结构体中的ct

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

nginx源码分析--模块分类

ngx-modules Nginx 主要的模块大致可以分为四类: handler – 协同完成客户端请求的处理.产生响应数据.比如模块, ngx_http_rewrite_module, ngx_http_log_module, ngx_http_static_module. filter – 对 handler 产生的响应数据做各种过滤处理.比如模块, ngx_http_not_modified_filter_module, ngx_http_header_filter_module. ups

[nginx] nginx源码分析--健康检查模块锁分析

健康检查模块 见前文:[nginx] nginx源码分析--健康检查模块 其中有一张框架图, 接下来的内容,将会利用到这个图中的内容. [classic_tong @ https:////www.cnblogs.com/hugetong/p/12274125.html ]  描述 我们知道nginx是多进程的,每个进程都保存了相同的配置.但是实际上, 并不需要每一个进程对每一个后端服务器进行. 于是健康检查模块在这里需要一个进程间同步机制,用来协商哪一个进程对 哪一个后端服务器进行检查. 接下来

nginx源码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个web服务器,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字.这里不说各个结构体的构造 只说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞.接受发送的缓冲区.绑定.监听处理) 2