nginx-1.9.2代码理解及详细注释
为什么阅读nginx源码? nginx的高并发性能。
平时工作中除了linux内核网络协议栈开发外,也主要做服务器端开发,加上喜欢研究开源源码,因此在周末及下班空余时间拜读下nginx源码。
7月底从nginx官网下载了最新源码,官网文档阅读后,然后开始正式阅读代码。
nginx的以下功能模块的相关代码已经阅读,并对其源码及相关数据结构进行了详细备注,主要参考书籍为淘宝陶辉先生 的《深入理解Nginx:模块开发与架构解析》,并对书中没有讲到的相关部分功能进行了扩展,通过边阅读边调试的方法 通读了以下功能模块,并对其进行了详细的注释,同时加了自己的理解在里面,注释比较详细,由于是周末和下班时间阅读,再加上自己 文采限制,代码及数据结构注释都比较白话,注释中肯定会有理解错误的地方。
阅读工具source insight,如果中文乱码,按照source insight configure目录中说明操作
截止15.9.19,已经分析并注释完成的主要功能如下: .配置编译过程中相关脚本调用过程详细注释 .用户自由模块编译添加过程 .nginx使用的进程间通信方式(包括共享内存 原子操作 自旋锁 信号 信号两 文件锁 互斥锁 channel通信) .nginx自定义高级数据结构详解(队列 链表 红黑树 散列表等) .配置文件解析流程 .nginx启动、退出过程分析 .连接池 内存池分配管理过程 .对客户端链接如何实现负载均衡,“惊群”问题避免 .主动链接 被动链接过程分析 .epoll事件驱动机制,epoll模型详解,包括读写异步非阻塞处理机制及流程。 .时间机制及定时器详解. .异步I/O,sendfile代码分析 .http框架处理流程及11个阶段处理及调用过程 .HTTP请求行、请求头部、包体异步读取解析过程 .HTTP异步非阻塞发送HTTP头部和包体过程 .HTTP阻塞任务如何拆分。 .任务处理完毕执行流程。 .资源回收过程
15.10.2 nginx变量(内部自定义变量以及配置文件中添加的变量)的定义解析过程分析。 脚本引擎代码分析 nginx十一个阶段处理重新详细分析。 rewrite机制详细分析,以及location{}定位进行进一步分析。
15.11.29
把之前的读取客户端包体进行了重新分析,并做了详细解释,配合图形说明
上游服务器连接细化分析,细化upstream和fastcgi配合过程细节,
output_chain代码详细分析
writev功能分析。
负载均衡算法(轮询和iphash)分析以及和upstream、fastcgi配合调用整体流程分析
fastacgi协议细化,fastcgi格式组包过程分析。
writev_chain分析
变量中的位用%d %u之类打印,容易引起段错误
fastcgi应答头部行解析过程以及赋值给request的headers_out过程
新增每行日志打印函数名和行号功能,有利于分析程序执行流程。
15.12.25 buffering方式和非buffering方式处理后端数据的流程详细分析。 buffering方式pipe处理流程详细分析 keepalive模块代码理解,后端连接缓存原理分析。 分析后端服务器失效判断方法,已经再次恢复使用检测方法分析 反向代理proxy-module详细分析,proxy_pass相关接收方式格式组包解析分析,proxy模块非阻塞发送接收原理分析 chunk编码方式分析,触发按照chunk方式发送包体到后端条件,以及组包过程分析 keepalive-module后端服务器连接缓存进一步分析 子连接subrequest及其相应的postpone分析 多级subrequest如何保证数据按照指定先后顺序发送的客户端浏览器代码分析。 临时文件创建管理缓存过程分析,以及相关配置详细分析。 指定的缓存不够的情况下,后端数据写入临时文件过程分析 proxy_cache原理分析,包括共享内存创建,管理,参数解析等 slab原理分析,以及slab管理共享内存过程分析
16.1.2
推敲分析缓存后端数据的时候为什么需要临时文件,代码详细中做了详细流程分析
loader进程,cache manager进程处理过程分析,响应handler定时指向机制分析
缓存文件命中发送过程分析
缓存文件stat状态信息红黑树存储及老化过程分析
缓存文件红黑树存储过程及老化分析
缓存文件loader加载过程分析
aio异步文件读取发送分析
sendfile流程分析
线程池详解分析
aio sendfile 线程池分界点详细分析
16.1.10 推敲为什么每次在发送后端数据最后都会调用ngx_http_send_special的原因分析 进一步分析aio异步事件触发流程 关键点新增打印,利用分析日志。 分析在ngx_http_write_filter的时候,明明从后端接收的数据到了缓存文件,并且理论上出去的数据时in file的,单实际上在out的时候却是in mem而非in file sendfile与普通ngx_writev分界点进一步分析 缓存情况下的copy filter执行流程和非缓存情况下的copy filter执行流程进一步分析注释。 filter后端数据到客户端的时候,是否需要重新开辟内存空间分界点详细分析。 分析直接direct I/O的生效场景,以及结合相关资料分析说明时候使用direct I/O direct I/O和异步AIO结合提升效率代码分析及高压测试 directio真正生效过程代码分析 同时配置sendfile on; aio on; dirction xxx;的情况下sendfile和aio选择判断流程详细分析 线程池thread_pool_module源码详细分析注释 aio thread执行流程详细分析 进一步分析获取缓存文件头部部分和文件后半部包体部分的发送流程。 secure_link权限访问模块原理分析,以及代码分析,并举例测试分析 从新走到index和static模块,配合secure_link测试。 添加第三方模块-防盗链模块,了解原理后走读代码分析
16.1.17 分析uri中携带的arg_xxx变量的解析形成过程,配合secure link配合使用,起到安全防护作用,对该模块进行详细分析注释 aio thread_pool使用流程分析,线程池读取文件过程分析。 普通读方式下大文件(10M以上)下载过程流程分析,以及与小文件(小于32768)下载过程不同流程比较分析 AIO on方式下大文件(10M以上)下载过程流程分析,以及与小文件(小于32768)下载过程不同流程比较分析 AIO thread_pool方式下大文件(10M以上)下载过程流程分析,以及与小文件(小于32768)下载过程不同流程比较分析 新增小文件(小于65535/2)下载全过程和大文件下载全过程日志,可以直观得到函数调用流程,完善日志 结合refer防盗链模块重新把hash走读理解注释一遍,加深理解 重新理解前置通配符后置通配符hash存储过程 添加lua库和lua-module 把定时器 事件机制函数相关修改添加到lua模块和redis模块