Nginx源码分析
Nginx源码阅读、Nginx源码分析、Nginx源码
老码农zhuli
自娱自乐的代码人!GIT:https://github.com/zhuli
展开
-
Nginx源码分析 - 初探Nginx的架构(01)
Nginx是我们日常使用非常多的一款服务器。Nginx的源码写的非常漂亮,是c语言学习和进阶的最好的学习资料。下面我们先看下Nginx的目录结构:Nginx的源码主要分布在src/目录下,而src/目录下主要包含三部分比较重要的模块。1. core:包含了Nginx的最基础的库和框架。包括了内存池、链表、hashmap、String等常用的数据结构。2. event:事件模原创 2016-01-25 19:20:44 · 44555 阅读 · 14 评论 -
Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)
Nginx的内存管理是通过内存池来实现的。Nginx的内存池的设计非常的精巧,很多场景下,我们可以将Nginx的内存池实现抽象出来改造成我们开发中的内存池。内存池一般我们使用malloc/alloc/free等函数来分配和释放内存。但是直接使用这些函数会有一些弊端:1. 虽然系统自带的ptmalloc内存分配管理器,也有自己的内存优化管理方案(申请内存块以及将内存交还给系统原创 2016-01-26 17:38:28 · 37831 阅读 · 27 评论 -
Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03)
前面一章我们介绍了Nginx的内存池的数据结构。Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。Nginx的Array结构设计得非常小巧,主要用于存储小块内存。Nginx的数组每个元素的大小是固定的。数据结构定义ngx_array_t 数组的基础数据结构/* 数组Array数据结构 */typedef stru原创 2016-01-28 16:50:33 · 13063 阅读 · 14 评论 -
Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)
Nginx的buf缓冲区数据结构,主要用来存储非常大块的内存。ngx_buf_t数据结构也贯穿了整个Nginx。缓冲区ngx_buf_t是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。数据结构定义缓冲区内存块的数据结构 ngx_buf_t/** * Nginx缓冲区 */struct ngx_buf_s { u_char原创 2016-01-30 13:32:53 · 13037 阅读 · 12 评论 -
Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)
Nginx的queue链表结构非常小巧和简单。设计的非常精巧。通过queue的简单和精巧的设计,让Nginx的queue的数据结构和具体业务依赖进行了解耦。一般我们在设计c语言程序的时候,完全可以学习Nginx的这种数据结构的设计方式。数据结构定义链表数据结构 ngx_queue_ttypedef struct ngx_queue_s ngx_queue_t;/**原创 2016-01-31 17:49:19 · 7221 阅读 · 3 评论 -
Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)
Nginx的list单向链表的结构和Nginx的数组结构Array有点类似。Nginx的单向链表也是固定了每个元素的大小,并且用单向链表的方式连接。数据结构定义ngx_list_part_t 链表节点定义typedef struct ngx_list_part_s ngx_list_part_t;/** * 链表节点 每个节点大小 = size * nelts原创 2016-02-05 10:11:45 · 6268 阅读 · 6 评论 -
Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
Nginx的hash表结构和我们之前阅读memcached的时候看到的会有很大的差别。Nginx的hash表结构主要几个特点:1. 静态只读。当初始化生成hash表结构后,是不能动态修改这个hash表结构的内容。2. 将内存利用最大化。Nginx的hash表,将内存利用率发挥到了极致,并且很多设计上面都是可以供我们学习和参考的。3. 查询速度快。Nginx的hash表做了内存对齐等原创 2016-02-16 16:25:34 · 8309 阅读 · 4 评论 -
Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)
Nginx的ngx_str_t字符串结构非常简单和好用。nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构数据结构定义ngx_str_t 字符串结构/** * 字符串结构 */typedef struct { size_t len; //字符串长度 u_char *d原创 2016-02-17 18:50:12 · 6785 阅读 · 2 评论 -
Nginx源码分析 - 主流程篇 - Nginx的启动流程(09)
前几篇主要介绍了Nginx比较常用的一些基础数据结构,例如pool,buf,array,list等。通过对Nginx基础数据结构的理解,能更好的帮助我们读懂整个Nginx的源代码。这一章节开始主要分析Nginx的主流程。Nginx的主流程的实现函数在./src/core/nginx.c文件中。通过main()函数,我们可以窥探整个Nginx启动的流程。Nginx的启动过程m原创 2016-07-05 15:46:12 · 20639 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)
平滑重启上一篇文章我们分析了Nginx的启动流程。其中ngx_add_inherited_sockets主要用于继承Socket文件句柄。Nginx有平滑重启的功能,通过平滑重启,可以让用户无感知并且不中断。#平滑重启 sudo kill -HUP `cat /usr/local/nginx-1.4.7/nginx.pid` 无感知不中断的过程,就需要Nginx继承原先的so原创 2016-07-06 18:56:36 · 11109 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 全局变量cycle初始化(11)
Nginx的大部分初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)展开。本文主要讲解cycle的数据结构以及初始化过程中干了什么事情。cycle的初始化过程在/src/core/cycle.c文件中。数据结构ngx_cycle_t的数据结构/** * Nginx全局变量cycle */struct ngx_cycle_s { void原创 2016-07-11 17:54:21 · 10606 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 模块的初始化(12)
Nginx是高度模块化的,各个功能都会封装在模块中。例如core模块、HTTP模块等。也可以自定义模块。这一篇文章主要讲解模块的初始化。后续会有一篇文章教你如何编写Nginx的模块。Nginx实现模块管理的代码主要在:/src/core/ngx_module.c文件中。模块的数据结构结构体ngx_module_s主要用于管理每一个模块的详细信息。而模块的管理,主要放置在Nginx的全局变量cycl原创 2016-07-13 17:03:10 · 12490 阅读 · 2 评论 -
Nginx源码分析 - 主流程篇 - 解析配置文件(13)
Nginx源码中比较重要的一块就是配置文件的解析。一般是解析/usr/local/nginx/conf/nginx.conf文件中的配置信息。前一篇文章,我们介绍了Nginx的模块化。Nginx的功能模块都是通过cycle->modules 模块进行管理的。而每个模块都会有自己的配置文件。原创 2016-07-14 18:47:30 · 15401 阅读 · 5 评论 -
Nginx源码分析 - 主流程篇 - 多进程实现(14)
默认情况下,Nginx都是多进程的运行模式。Nginx和Memcached不一样,是多进程的模式。采用多进程模式最大的好处:1. 每个进程的资源独立2. 不需要添加各种繁琐的锁了Nginx多进程实现的流程图原创 2016-08-21 09:15:33 · 12316 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理(15)
Linux2.6版本之前还存在对于socket的accept的惊群现象。之后的版本已经解决掉了这个问题。惊群是指多个进程/线程在等待同一资源时,每当资源可用,所有的进程/线程都来竞争资源的现象。Nginx采用的是多进程的模式。假设Linux系统是2.6版本以前,当有一个客户端要连到Nginx服务器上,Nginx的N个进程都会去监听socket的accept的,如果全部的N个进程都对这个客户端的so原创 2016-08-21 14:05:28 · 17442 阅读 · 2 评论 -
Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)
Event的模块和配置的初始化,必须得结合我们讲过的两篇文章:《Nginx源码分析 - 主流程篇 - 模块的初始化》 和 《Nginx源码分析 - 主流程篇 - 解析配置文件》 前面我们讲解了模块的初始化以及核心模块的配置文件的解析。而Event的配置解析会比核心模块解析会复杂一些,但是原理是一样的。Event模块的配置数据结构event事件模块的配置:events {原创 2016-09-04 20:04:31 · 8448 阅读 · 3 评论 -
Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)
前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》 中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开始的。这一章开始,我们会详细透彻的分析Nginx的event模块。如果你还对网络IO模型不太熟悉的,建议先把原创 2016-08-22 19:30:35 · 13240 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)
前面一篇我们讲解了《Nginx源码分析 - Event事件篇 - Event模块和配置的初始化 》 ,了解了整个Event模块分为:ngx_events_module 事件模块 、ngx_event_core_module 事件核心模块 和 epoll/queue/win32_select事件模型模块这一篇,主要讲解一个重要的函数:ngx_event_process_initEvent事件的原创 2016-09-15 17:59:02 · 7067 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Epoll事件模块(19)
这一篇主要讲解一下epoll事件模型。Nginx支持多种事件模型:epoll/pool/select/kqueue等。epoll比较常用,我们也比较熟悉。Nginx的epoll事件模块在/event/module/ngx_epoll_module.c原创 2016-11-03 19:30:33 · 10123 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化(20)
前面几章整理了Nginx的事件模块,这一章开始整理HTTP模块。HTTP模块的初始化工作,都在src/http/nginx_http.c 中的ngx_http_block函数中进行的。http模块的配置在看nginx_http_block之前,我们还必须看一下nginx.conf中 HTTP大模块的配置文件,只有理解了HTTP模块的配置,才能更好的理解HTTP模块如何初始化的。配置如下:http原创 2016-12-17 10:14:52 · 8622 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - TCP连接建立过程(21)
上一章,我们讲解了HTTP模块是如何初始化的。这一章节,主要讲解监听套接字初始化函数ngx_http_optimize_servers和Nginx整个连接的过程监听套接字初始化函数ngx_http_optimize_serversngx_http_optimize_servers主要处理Nginx服务的监听套接字/** * ngx_http_optimize_servers:处理Nginx服务的原创 2016-12-18 19:11:42 · 7932 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)
这一章主要讲解read事件的核心处理函数:ngx_http_wait_request_handler和ngx_http_process_request_linengx_http_init_connection 初始化客户端连接从上一章知道,ngx_event_accept第一次建立连接的时候,会调用ngx_http_init_connection初始化一个客户端连接结构:ngx_connectio原创 2017-01-05 20:59:43 · 9530 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
上一章我们讲解了HTTP request的解析过程。我们基本知道了Nginx是如何解析HTTP的行和头。这一章我们主要讲解Nginx的阶段处理(PHASE 状态机实现)。阶段处理的概念如何理解,我举个例子:一个HTTP请求过来,除了解析HTTP的行和头外,还需要解析URI的rewrite、接受HTTP BODY中的POST数据、转发给后端JAVA/PHP服务器进行数据处理等等一系列的操作。Ngin原创 2017-06-07 14:49:26 · 7772 阅读 · 0 评论 -
Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)
Nginx源码分析 - 实战篇 - 编写一个自定义的模块原创 2017-06-08 12:03:28 · 9957 阅读 · 1 评论 -
Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)
HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - ngx_http_core_run_phases函数和HTTP模块的阶段处理PHASE handler》我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。先看代码:#include #include #include原创 2017-06-08 13:19:07 · 7390 阅读 · 8 评论