六年磨一剑——专访《Apache源代码全景分析第1卷:体系结构与核心模块》作者张中庆

针对张中庆老师的新书《Apache源代码全景分析第1卷:体系结构与核心模块》的出版,博文视点编辑对张中庆进行了邮件专访,现将博文编辑与张中庆的访谈对话整理成文,以飨读者。

博文编辑:张老师,您好!国内真正称得上“源码剖析”的图书非常少,分析Apache底层运作原理的著作更是凤毛麟角。得知您打算写这套书后,编辑部的同事对您的技术背景产生了浓厚的兴趣,可否请您简单回顾一下您的技术经历。

张中庆:我的工作经历非常简单,2000年从西安交大计算机系本科毕业后,就职于一家国营企业,负责银行相关软件的开发,在此期间接触了Unix下的服务器开发,并且一直进行着相关的开发工作。三年后辞职回到西交攻读硕士学位,毕业后在腾讯参与MMOG游戏服务器端的开发,目前任职于51.com。

博文编辑:您太谦虚了,写一套剖析源码的书除了要具备深厚的技术功底、丰富的实践经验外,更需要超出常人的毅力,您写第1卷花了6年的时间,是什么原因促使您决心写这本书的呢?

张中庆:阅读Apache的最初目的是希望能够了解大规模服务器的并发体系结构,提取一个可重用的网络框架。最初时只是希望了解Apache的并发体系结构,即现在的MPM模块,但是随着分析的深入,Apache的更多内容也纳入了分析的范围。分析的时候经常会出现以前看过的内容过了一段时间后又忘记了,于是只好重新开始,为了避免这种情况,就养成了文档记录的习惯。这些文档后来就发表到了CSDN的博客上。随着文档的增加,也就有了出版的打算,前前后后花了6年的时间。源码的分析和写作都是利用业余时间完成的,每天基本上只有两个多小时的时间,另外就是Apache实在太庞大,要理清它非常不容易,必须翻来覆去地看,前后连起来理解才行。

之所以能够坚持下来,最要感谢的是家人和朋友的鼓励,以及一些素不相识的对本书期待的读者的支持,每次想放弃的时候,是他们让我找到继续前行的力量。

博文编辑:您的这套书一共3卷,《Apache源代码全景分析第1卷:体系结构与核心模块》只是其中第1卷,可否请您介绍一下这3卷书在内容上是如何分配的,以及它们的内在联系。

张中庆:第1卷主要从整体架构上讨论Apache,重点讨论Apache的模块化体系结构和与模块相关的内容,包括配置、挂钩、过滤器等;第2卷主要讨论Apache请求处理的细节,包括URL重写、内容协商、认证授权、缓存,以及虚拟主机等内容;第3卷则主要介绍Apache的可移植运行库APR,APR是Apache的底层跨平台支撑库,这一卷重点分析APR的实现原理和APR的使用。

博文编辑:Apache的特点是具有清晰的模块化架构,您在第1卷中是如何分析Apache最核心的内容,来帮助读者理解其实现细节的呢?

张中庆:每一个Apache的模块内部包含了配置指令、请求挂钩、过滤器三大类,卷1的绝大多数内容正是围绕这三方面展开的。对于大多数读者而言,它们接触最多的就是Apache的指令,因此卷1首先讨论了Apache中指令的相关概念及Apache中对配置文件和指令的处理细节。通过对内容的熟悉,引导用户进入到对Apache的分析中来。

模块是Apache的基础,在介绍完配置文件之后,紧接着第5章花了较大的篇幅来介绍Apache中的模块相关的概念,包括:Apache的模块数据结构;Apache是如何加载和组织模块的;模块指令表;模块中的挂钩;模块间的通信方式等。

在详细介绍完Apache的模块相关概念之后,第7章详细介绍了第一个模块——MPM模块,该模块负责Apache的并发处理。第7章中还介绍了三种重要的并发方式——Prefork、Worker和WinNT MPM。

MPM负责并发框架处理,同时还负责创建套接字、侦听套接字。对于MPM中的每一个进程或线程,它们接受客户端连接,然后从连接中读取请求数据。连接处理和请求读取的详细细节在第8章网络连接中讨论。

从网络中读取请求数据,由Apache中的CORE_IN过滤器完成;向网络中写入响应数据,由CORE过滤器完成。对于读取到的数据,它们交由核心进行处理之前,需要经过一系列的过滤器处理。因此在进一步深入请求处理的细节之前,必须了解过滤器的概念和实现原理。因此在卷1的最后三章,我们详细讨论了过滤器的细节。

博文编辑:近年来陆续有一些轻量级的Web服务器软件涌现,比如由德国人主持开发的Lighttpd和由俄罗斯人编写的Nginx,您觉得这些“后生晚辈”会不会对Apache构成威胁。

张中庆:Lighttpd和Nginx都属于轻量级的Web服务器,它们的出现自然会抢占一些属于Apache的市场份额。不过Lighttpd、Nginx和Apache并不是相互排斥,相互对立的。Lighttpd和Nginx的长处在于处理静态页面,它们的处理速度可以达到Apache的2~3倍,极端情况下能达到10倍。因此通常情况下,Apache用来作为后台服务器,处理PHP、CGI等,生成动态内容;Nginx用来作为前端服务器,从而充分利用它占用资源少的优势来处理静态页面的大量请求,而Lighttpd则通常用于图片服务器。

可以相信,随着Lighttpd和Nginx的逐渐成熟和完善,它们也会成为主流的Web服务器,对Apache构成一定的威胁。