Nginx源码阅读
文章平均质量分 87
Nginx是一个 Web服务器,也可以用作反向代理,负载平衡器和 HTTP缓存。Nginx 是免费的开源软件,根据类似 BSD许可证的条款发布。大部分 Web服务器通常使用 NGINX 作为负载均衡器。这里主要学习其整体架构、进程模型、事件模块、负载均衡等。
UKey_
勿以浮沙筑高台
展开
-
nginx源码阅读(十五).事件模块小结(从解析配置到事件的处理)
前言配置项结构体的创建及赋值初始化工作处理事件小结前言本小节主要是整理一下前几节分析的nginx的核心模块的ngx_events_module以及事件模块,关于事件模块什么时候初始化以及事件的处理等,因此不会涉及到太多具体的代码,主要是把握事件模块的整体。配置项结构体的创建及赋值在使用一个模块的功能之前,我们需要先根据配置文件来定制该模块的功能,对于事件模块来说,有选取哪种事件模型,以及单原创 2017-11-13 09:10:23 · 921 阅读 · 0 评论 -
nginx源码阅读(十四).惊群问题的解决
前言accept导致的惊群问题epoll导致的惊群问题多个进程共用一个epfd多个进程有自己的epfd小结前言本小节将看到nginx中解决惊群现象的方法。所谓惊群现象,简单的来说就是当多个进程或线程在同时阻塞等待同一个事件时,如果该事件发生,会唤醒在等待的所有的进程/线程,但最终只可能有一个进程/线程对该事件进行处理,其他进程/线程会在失败后重新休眠,唤醒多个进程/线程这种不必要的行为会造原创 2017-11-11 22:31:41 · 2360 阅读 · 1 评论 -
nginx源码阅读(十三).新建连接并处理就绪事件
前言如何建立新连接建立新连接的回调函数处理事件小结前言本小节主要讨论事件模块中如何接受新连接,其中涉及到了惊群以及负载均衡的处理。如何建立新连接之前在分析ngx_event_process_init函数时,将所有空闲连接形成链表之后,它会遍历所有监听端口并将其读事件的回调函数设置为ngx_event_accept接着会把监听连接的读事件添加到ngx_epoll_module模块中。当执行ng原创 2017-11-09 22:12:01 · 980 阅读 · 0 评论 -
nginx源码阅读(十二).定时器及超时事件的管理
前言时间缓存缓存时间的精度定时器的实现小结前言本小节将分析nginx定时器以及时间管理部分的知识,当事件超时时,会触发nginx中的超时机制进行处理。nginx的定时器的底层实现是使用的红黑树,这里就不去讲解红黑树了,网上有很多资料。时间缓存nginx为了性能方面的考虑,并不是每次需要获取时间时都调用gettimeofday函数,而是将时间缓存下来存在全局变量中(core/ngx_times原创 2017-11-08 16:15:25 · 1423 阅读 · 0 评论 -
nginx源码阅读(十一).ngx_epoll_module模块(上)
前言模块的通用接口感兴趣的配置项存储配置项的结构体事件模块的通用接口小结前言事件模块中有封装了多种I/O多路复用机制的模块,这里只分析epoll对应的ngx_epoll_module模块,如果你对其他的感兴趣,可以参照本小节分析的源码及步骤,因为其他驱动模块的实现与ngx_epoll_module都是大同小异的。 首先我们还是从通用接口ngx_module_t下手。模块的通用接口ngx原创 2017-11-07 21:55:57 · 1061 阅读 · 0 评论 -
nginx源码阅读(十).ngx_event_core_module模块
前言所有模块的通用接口ngx_module_t感兴趣的配置项ngx_event_core_commands存储配置项的结构体ngx_event_conf_t事件模块的通用性接口ngx_event_module_t小结前言本小节将进入到ngx_event_core_module模块,它是所有事件模块中排第一位的模块,因为要负责创建连接池,还要选择I/O多路复用机制等工作。接下来我们就来看看它原创 2017-11-06 21:31:45 · 1163 阅读 · 0 评论 -
nginx源码阅读(九).事件及连接的定义、连接池
前言事件的定义连接的定义关于连接池小结前言本小节将分析事件模块中事件的定义以及连接池等相关定义,方便我们后面对事件模块中的模块进行分析。事件的定义每个事件由ngx_event_s表示:struct ngx_event_s { /* 跟事件相关的对象。通常指向ngx_connection_t连接 * 当开启了文件异步I/O之后,它可能会指向ngx_event_aio_t结构体原创 2017-11-06 08:52:47 · 1122 阅读 · 0 评论 -
nginx源码阅读(八).ngx_events_module模块
前言在上一小节中我们对模块的整体有了一定的把握,本小节将进入到事件模块的分析中,了解nginx是如何收集、管理、分发事件的。nginx将网络事件以及定时事件集成到一起进行管理,由于各平台的I/O多路复用机制不同,但是nginx支持多个操作系统,因此在事件模块中也实现了多种针对不同平台下封装I/O多路复用机制的模块。由于我所用的环境主要关注的是linux,因此后面主要分析ngx_epoll_modul原创 2017-11-04 22:01:25 · 1043 阅读 · 0 评论 -
nginx源码阅读(七).nginx的模块化设计
前言高度模块化是nginx的一个特点,在正式进入到具体的模块之前,有必要从整体把握各模块之间联系与nginx对模块的控制。在前面的分析中其实已经使用了模块中提供的方法,比如worker进程的工作循环中调用的ngx_process_events_and_timers()函数,用于处理事件。模块之间的联系官方提供了5个类型的模块:核心模块、配置模块、事件模块、http模块、mail模块原创 2017-11-03 21:43:53 · 1323 阅读 · 0 评论 -
nginx源码阅读(六).内存池
前言本小节中,我们将看到内存池的实现。由于nginx是由c语言实现,并没有垃圾回收机制,比较容易导致memory leak,因此nginx实现了自己的内存池,将内存的管理和释放交给内存池,而需要申请内存的地方直接使用内存池来申请内存即可,每个连接/请求都会新建一个内存池。既然释放内存是由内存池来释放,那么何时释放也是一个问题,nginx中的做法是在内存池销毁的时候也将内存释放了,这样可行是因为ngi原创 2017-11-02 22:05:21 · 1026 阅读 · 0 评论 -
nginx源码阅读(五).worker进程的工作循环
前言在上一小节中,我们看到了nginx是如何使用master进程创建子进程,以及存储子进程的状态,也知道了进程间通信采用的是socketpair机制。接下来我们将重点分析ngx_spawn_process调用的proc函数,即worker进程的工作循环。ngx_worker_process_cycleproc是一个函数指针,worker进程对应的是ngx_worker_process_cycle函数原创 2017-11-01 21:27:43 · 1028 阅读 · 0 评论 -
nginx源码阅读(四).创建子进程(worker和cache)
前言在上一小节中,我们主要分析了master进程的工作循环。本小结中,我们将看到nginx是如何创建worker进程的。在上一小节中分析master进程的工作循环时,调用了ngx_start_worker_processes函数,但是其内部调用的创建子进程的代码在ngx_spawn_process中。ngx_spawn_process创建进程自然想到的就是调用fork函数。ngx_原创 2017-10-31 19:50:31 · 1756 阅读 · 2 评论 -
nginx源码阅读(三).master进程的工作循环
前言在上一个小节中,我们分析了一下nginx的初始化工作,在最后部分nginx进入多进程工作模式/单进程模式。单进程模式一般用于调试,实用性不高。本小节将分析master和worker进程所做的一些工作,比如master如何控制worker进程以及worker进程执行的流程。首先需要知道nginx由一个master进程管理多个worker进程,worker进程负责处理请求,而master负责做管理工原创 2017-10-30 21:59:46 · 1484 阅读 · 0 评论 -
nginx源码阅读(二).初始化:main函数及ngx_init_cycle函数
前言在分析源码时,我们可以先把握主干,然后其他部分再挨个分析就行了。接下来我们先看看nginx的main函数干了些什么。main函数这里先介绍一些下面会遇到的变量类型:ngx_int_t: typedef intptr_t ngx_int_t; 64位机器上,intptr_t为long int, 即typedef long int intptr_t;在32位机器上,intptr_t为int,即t原创 2017-10-29 21:45:49 · 1951 阅读 · 0 评论 -
nginx源码阅读(一).综述
前言nginx作为一款开源的轻量级高性能web服务器,是非常值得立志从事服务端开发方向的人学习的。现今nginx的最新版本是nginx-1.13.6,代码量也日渐庞大,但是由于其核心思想并没改变,为了降低阅读难度,我选择的是nginx-1.0.15版本,并且由于时间和水平有限,重点关注的是nginx的启动以及进程模型、事件模块中的epoll模块、负载均衡以及整体的框架等方面。 这里先推荐两本原创 2017-10-28 09:33:43 · 11030 阅读 · 0 评论