前 言
深入剖析Nginx
慕名对Nginx源码进行学习与研究是早在2008年的事情。当时正在为职业规划与未来发展困惑不已,一筹莫展之际不知从哪里得知高性能服务器是一个很有“前途”的努力方向,几经搜索又机缘偶合地得识Lighttpd与Nginx。在逐步了解和熟悉它们的源码后,我开始感到自己的无知与浅薄,发现原来代码也可以写得如此优雅。
我已编著过一本《Lighttpd源码分析》。先解析Lighttpd源码并没有什么特别的原因,只是因为在当时Lighttpd比Nginx要火,应用得也较广;而近几年,凭借专注持续的更新与运作,Nginx后来居上,在全世界的应用仅次于Apache与Microsoft IIS1,而且大有赶超IIS的势头。
Nginx提供了一个安全、快速并且灵活的Web Server 环境。与其他Web Servers相比,其主要特点是占有系统资源少、并发能力强、稳定性好,这些都是吸引网站架构人员重点关注以及对其进行广泛应用的巨大优点。然而,对于开发工程师而言,更有吸引力的地方却是Nginx是怎样做到如此强劲的功能与性能的,这从因特网上存在大量的Nginx源码分析的博客文章与论坛帖子可见一斑。
既然互联网上已有大量的Nginx源码分析文章,那我现在编写这本《Nginx源码分析》是否多此一举?我会说不是,毕竟它较为完整地梳理了Nginx的相关核心流程。当然,这只是我给出的答案,最终还需要各位读者来回答。我在此阐述一下自己的看法。本书的原始素材是我在最近三四年里地对Nginx代码分析时断断续续地所做的笔记,只不过之前写的笔记过细地逐行注释代码,导致文档中充斥大量的代码。而在这次重新整理后,希望能从比较高一点的角度去解析Nginx,把握全局,搞清楚整体实现原理而不是陷入细节。我个人认为,只要看清楚了Nginx整体的实现原理,对于一时半会没有触及到的细节,在真正遇到那个点时再去理解也是毫不费力,最多只不过还需去查一下Man手册,了解一下系统API而已。授人以鱼不如授人以渔,为了达到这个目标,本书力争尽量少贴代码多画图,当然一些必要的代码仍然是不可或缺的,所以读者还是会在本书看到源代码。虽然我的最初出发点是好的,但是在解析Nginx的某些功能时,我的确遇到了困难,特别是在解析到一大片代码却并没有孰轻孰重的情况下,实在让我很纠结,把代码全部贴上将占去大量的版面,会违背我少贴代码的初衷,不贴上又怕读者不知我所云何物而看不懂。这不仅是因为Nginx代码本身的耦合性较大,也在于我个人的文字描述能力有待提高,所以导致本书或多或少的各种缺点,比如啰嗦的地方、没讲到的细节等,还请各位读者多多包涵。
目 录
第1章 源码分析的准备工作text
1.1 主要特性
1.2 源码下载
1.3 源码目录结构
1.4 源码分析工具
1.5 测试辅助工具
1.6 编译与执行
1.7 其他准备
第2章 跟踪与调试
2.1 利用gdb调试
2.2 利用日志信息跟踪Nginx
2.3 利用strace/pstack调试Nginx
2.4 获得Nginx程序完整执行流程
2.5 加桩调试
2.6 特殊应用逻辑的调试
第3章 进程模型
第4章 数据结构
第5章 配置解析
第6章 模块综述
第7章 事件管理机制
第8章 变量机制
第9章 请求处理与响应
第10章 请求定位
第11章 动态页面请求处理
第12章 过滤模块
第13章 负载均衡
第14章 访问控制