基本信息
编辑推荐
源码之前,了无秘密
资深工程师多年研读代码、精心打磨之作
ChinaUnix社区、运维专家、一线工程师强烈推荐
内容简介
计算机书籍
Nginx是一款功能强大的高性能Web和反向代理服务器,最初由俄罗斯程序员Igor Sysoev开发,而当前由Igor Sysoev领导的专业公司Nginx, Inc.进行持续的维护与更新。Nginx可以在大多数UNIX或类UNIX系统上编译运行,比如FreeBSD、Solaris、Linux等,并且官方还提供有Windows下的可执行版本。目前,Nginx在Netflix、Wordpress.com、新浪、网易、腾讯、豆瓣等国内外众多知名网站中应用。
《深入剖析Nginx》不是一本关于Nginx配置指令如何使用的介绍手册。本书重点在于通过剖析Nginx的源代码,探究其功能结构及其内部实现原理。全书共14章和3个附录。首先介绍了开始剖析Nginx源代码前的准备工作,以及跟踪和调试的方法;然后,分别深入分析了Nginx的进程模型、数据结构、配置指令、主要功能模块、I/O事件处理、变量机制、客户端请求过程、Filter模块实例、负载均衡策略以及Handler模块等。附录部分提供了Nginx的编译模块、运行配置等有用信息。
从源码剖析的角度出发,是程序员常用的学习和提高方法。《深入剖析Nginx》是作者多年研读Nginx代码、深入思考和不断实践的结晶。《深入剖析Nginx》适合系统程序员、软件开发工程师、Nginx高级运维工程师阅读参考,对于有志从事相关工作的IT专业学生,更是不可多得的学习资料。
作译者
目录
第1章 源码分析的准备工作 1
1.1 主要特性 1
1.2 源码下载 4
1.3 源码目录结构 5
1.4 源码分析工具 6
1.5 测试辅助工具 7
1.6 编译与执行 8
1.7 其他准备 9
第2章 跟踪与调试 10
2.1 利用gdb调试 10
2.1.1 绑定Nginx到gdb 10
2.1.2 gdb的watch指令 13
2.1.3 Nginx对gdb的支持 14
2.1.4 宏 16
2.1.5 cgdb 18
2.2 利用日志信息跟踪Nginx 19
2.3 利用strace/pstack调试Nginx 21
2.4 获得Nginx程序完整执行流程 23
2.5 加桩调试 29
前言
我已编著过一本《Lighttpd源码分析》。先解析Lighttpd源码并没有什么特别的原因,只是因为在当时Lighttpd比Nginx要火,应用得也较广;而近几年,凭借专注持续的更新与运作,Nginx后来居上,在全世界的应用仅次于Apache与Microsoft IIS1,而且大有赶超IlS的势头。
Nginx提供了一个安全、快速并且灵活的Web Server环境。与其他Web Servers相比,其主要特点是占有系统资源少、并发能力强、稳定性好,这些都是吸引网站架构人员重点关注以及对其进行广泛应用的巨大优点。然而,对于开发工程师而言,更有吸引力的地方却是Nginx是怎样做到如此强劲的功能与性能的,这从因特网上存在大量的Nginx源码分析的博客文章与论坛帖子可见一斑。
既然互联网上已有大量的Nginx源码分析文章,那我现在编写这本《Nginx源码分析》是否多此一举?我会说不是,毕竟它较为完整地梳理了Nginx的相关核心流程。当然,这只是我给出的答案,最终还需要各位读者来回答。我在此阐述一下自己的看法。本书的原始素材是我在最近三四年里地对Nginx代码分析时断断续续地所做的笔记,只不过之前写的笔记过细地逐行注释代码,导致文档中充斥大量的代码。而在这次重新整理后,希望能从比较高一点的角度去解析Nginx,把握全局,搞清楚整体实现原理而不是陷入细节。我个人认为,只要看清楚了Nginx整体的实现原理,对于一时半会没有触及到的细节,在真正遇到那个点时再去理解也是毫不费力,最多只不过还需去查一下Man手册,了解一下系统API而已。授人以鱼不如授人以渔,为了达到这个目标,本书力争尽量少贴代码多画图,当然一些必要的代码仍然是不可或缺的,所以读者还是会在本书看到源代码。虽然我的最初出发点是好的,但是在解析Nginx的某些功能时,我的确遇到了困难,特别是在解析到一大片代码却并没有孰轻孰重的情况下,实在让我很纠结,把代码全部贴上将占去大量的版面,会违背我少贴代码的初衷,不贴上又怕读者不知我所云何物而看不懂。这不仅是因为Nginx代码本身的耦合性较大,也在于我个人的文字描述能力有待提高,所以导致本书或多或少的各种缺点,比如啰嗦的地方、没讲到的细节等,还请各位读者多多包涵。
读者对象
我面试过不少刚本科毕业或研究生毕业的应届生,问得比较多的一句是:写过实际应用的代码么?答:没有。我又问:看过什么优秀的开源代码么?答:没有。这种情况很糟糕。限于国内大学的环境,除了较为简单的课程设计以外,很多大学生在校园内很少有机会写代码或参与实践问题的解决。针对这一点,至少我们可以去看一些有价值的优秀开源代码,毕竟在大学校园里,我们有时间、有地点、有资源(教室、图书馆、电子阅览室等)。所谓他山之石,可以攻玉,在理解这些开源代码的过程中,我们甚至可以尝试写一些扩展功能模块,逼迫自己去主动学习,培养扎实的理论基础知识,锻炼实际的动手编程能力,自己也会因此逐步成长许多。
本书的另一目标读者群为软件开发工程师,这是显而易见的事情。短小精悍的Nginx实现了如此强大的HTTP服务、反向代理服务以及邮件代理服务等,这些功能值得每一位软件开发工程师去学习和研究,况且国内也有不少项目在对Nginx进行二次开发或移植整合,有一本能帮助开发工程师快速开展工作的书籍也许能加快项目进度。
另外,鉴于国内对Nginx的广泛使用,虽然Nginx官网上有不少针对配置使用的文档,但是限于文字描述的简洁性与文档更新的滞后性,对于运维工程师而言,一些配置指令的使用是靠逐步验证来判断其具体使用用法的。通过本书的介绍,我们能从源代码上去找对应配置指令的用法并理解其真实的实际功能,即它让源代码本身就变成一本配置使用手册。所以,对于那些具有强烈意愿知其然又知其所以然的高级运维工程师,本书也是一个不错的选择。
我假设本书的读者已经掌握了C语言,并且对Linux系统有一定程度的了解。不过,即使在开始阅读本书之前,读者在这些方面存在一些不足也无关紧要,我会尽可能地把相关扩展链接标注出来,读者查询一下相关资料即可。
本书的读者对象主要是如下三类人群:
在校大学生;
软件开发工程师;
Nginx高级运维工程师。
Nginx版本
本书基于Nginx—1.2.0,该版本是我在重新开始做文档整理时Nginx的最新版本。Nginx
源码更新较为频繁,但更新的主要是Bug修正或增添新功能,而其主要架构是稳定的,所以
不论哪个版本的Nginx,本书基本都是适用的。
本书讨论环境
我是一名Linux开发工程师,所以本书的讨论环境也就是以Linux为主,使用的所有相关工具都是Linuxl下的,比如调试工具gdb、编译工具gcc、测试命令strace/pstack、测试工具wget2、curl3等。
Nginx本身提供的相关机制,对各种平台都进行了支持,比如I/O多路复用模型就支持epoll、kqueue、eventpon等,但本书仍然以Linux平台上的机制为主要讨论对象,像I/O多路复用模型里就是epoll。在没有明确说明的情况,默认的编译模块以附录A为准,且默认以附录B给出的配置运行Nginx。
媒体评论
—— China Unix社区
本书作者从实际情况出发,以当下新的系统版本和软件版本为例,从最开始的搭建调试环境准备到Nginx的源码工作机制一一讲解。本书还针对一些常用网站的需求,对Nginx常用的功能模块进行修改以符合实际需要。从我的职业角度来看,本书特别适合追求高性能、高标准的高级运维工程师。
——刘鑫 ChinaUnix版主,《高性能网站构建实战》作者
Nginx是得到国内外各大网站切实应用、经过实践证明的优秀项目。通过本书,你可以系统地学习和解读Nginx源码。这不仅是提高个人技能水平的最好学习方式,也是给自己职业生涯添筹加码的最佳有效途径。
——杨晖 深圳市闻道移动科技有限公司,技术总监
目前Nginx的应用非常广泛,本书从源码角度对Nginx核心机制进行了系统的剖析和梳理。不论是软件开发工程师,还是运维工程师,都非常值得一读。
——贺剑 Cisco Systems公司,工程师
得益于该书对Nginx的系统介绍,我们项目小组成员快速地了解了Nginx内部原理,保障了项目的顺利进行。也向你郑重推荐本书。
——刘杰 华为技术有限公司,项目经理
除了与Nginx本身相关的逻辑之外,书中还结合作者个人经验探讨了软件调试、数据结构、I/O模型、TCP/HTTP协议等多个重要的方面,令人受益匪浅。
——蔡洲 LogicMonitor公司,工程师