前言
写作目的
从Tim Berners-Lee 1991年编写的CERN HTTP服务器算起,Apache已经诞生了近20年的时间。这些年来,Apache已经成为目前最为流行的Web服务器,支撑着无数大小网站的运行。随着Apache技术的发展,关于Apache的图书纷纷问世。但是,这些书讨论的几乎都是如何对Apache进行管理和配置的,只有很少的图书对Apache模块的开发进行分析和讲解。而对Apache体系结构和内部运行机制的介绍一直是空白。
众所皆知,Apache 良好的模块化架构设计已经成为经典的服务器架构——易于扩展、易于维护。几乎每一个程序员都可以从 Apache 的架构中吸取到丰富的营养。虽然 Apache的代码非常优美,架构层次非常清晰,但是在缺乏资料的情况下,开发人员想在短时间内读懂Apache架构和内部细节并不是一件容易的事情。在陷入迷茫和一头雾水之后,他们可能就会选择放弃,从而与Apache的优美架构失之交臂。
本书写作的目的就是通过阐述Apache源代码,将Apache的整体架构和内部机制呈现给读者,让更多的人了解和熟悉Apache架构。本书的另一个目的就是希望阐述Apache模块开发中会遇到的各种问题。
本书适合谁
■ 顾名思义,本书是一本深入分析Apache源代码的书籍。首先,本书最适合于那些想急切了解Apache源代码内幕的读者,他们能够从本书中了解到关于Apache内幕细节的方方面面,从指令运行、模块细节到挂钩处理、请求处理等。
■ 其次,Apache 模块开发者也是本书的读者。虽然本书并不是一本专门讲述如何开发模块的图书,但是对于模块开发者而言,他们可以通过本书了解到关于模块和模块开发的所有细节内容。本书并不仅限于告诉你如何照猫画虎地增加一个新的模块,而是告诉你为什么要这么做。书中对于模块的每一个细节的阐释都非常清晰,因此,虽然本书并不是一本直接讲述模块开发的图书,但是通过阅读本书,你完全可以掌握其模块开发。
■ 须要强调的是本书并不是一本讨论Apache管理的图书。因此,如果Apache管理员想从本书中找到如何编译安装使用Apache、如何配置管理Apache是不可能的,这种书市场上已经多如牛毛。但是这并不意味着本书对Apache管理员来说没有任何的价值。对于Apache管理员来说,他们大部分时间是在对Apache配置文件进行处理,通过本书,管理员们可以了解到Apache配置文件及配置指令幕后运行的细节,不仅知其然而且知其所以然,在阅读了本书之后,你甚至可以自己扩展Apache的指令,对于高级管理员而言,通过源代码的分析,可以对Apache进行最优化调优。
■ 如果你对Apache没有兴趣,但是你是一个服务器开发者,那么本书也会对你有相当的吸引力。本书以一百三十多页的篇幅来讨论Apache的多任务并发框架模块。各种MPM的介绍会有助于你的服务器开发。
■ 如果你对Apache没有兴趣,而且也不是一个服务器开发者,只是一个普通的开发者,那么Apache的模块化思想也非常值得你借鉴。Apache的高度模块化是Apache体系结构中最为耀眼的特性,熟悉和掌握这种思想,有助于开发良好的软件体系架构。
不同的开发人员对本书的关注点可以用表0-1描述。
表0-1
你需要什么技术基础
尽管谁都可以阅读本书,但是,如果想深入理解书中分析的内容,你必须具备以下几个条件。
1. 熟悉C语言
Apache的所有源代码都是使用C语言开发的。因此,如果你不熟悉C语言,则最好不要阅读本书。如果你熟悉C++,则会更好。Apache中的很多设计都借鉴了C++的一些思想,了解C++,会让你更容易理解这些设计。
2. 了解HTTP协议相关的内容
Apache Web服务器本质上是处理HTTP协议的服务器,因此,如果我们想理解Apache的链接请求处理细节,则必须了解 HTTP 协议。当你阅读本书的时候,手上最好能有一个HTTP协议规范参考。
3. 了解Apache配置
对Apache配置文件和配置指令的处理贯穿于整个Apache的运行期间。Apache启动的时候将构建配置树,在对请求处理的时候将读取配置信息。如果对Apache的配置指令体系不熟悉,则会妨碍你的阅读和理解。
本书的主要内容
本书是Apache源代码全景分析系列的第1卷——体系结构与核心模块,全书分为9章。
第1章 Web服务器概述
本章简要介绍了整个 Internet 的发展历史及 Apache 服务器的发展历史,并简要介绍了HTTP服务器的工作方式。在本章的最后部分,我们重点讲述了Apache服务器所具备的功能。
第2章 Apache体系结构
本章从整体上介绍了Apache的三层体系结构,并着重介绍了核心功能层,分析了核心功能层中各个重要的组件及它们之间的相互依赖关系。另外本章还讲述了Apache的运行流程及主函数的实现细节。
第3章 配置文件管理
配置文件管理是Apache的基础核心模块。本章详细介绍了配置文件中指令的相关概念,包括指令的上下文、指令参数,同时详细分析了Apache中对指令的实现。基于指令的概念,本章的另外一个讨论重点就是Apache中对配置文件的读取,读取后指令在内存中的组织方式,以及指令如何被调用执行。本章最后还介绍了自行增加一个Apache中并不存在的新的指令配置段。
第4章 Apache模块化体系结构
Apache模块化体系结构是本书介绍的重点内容之一,通过模块化,Apache可以很方便地进行第三方扩展及裁剪。本章详细介绍了模块数据结构,并对模块结构中成员的上下文进行介绍,包括指令表、挂钩、配置结构操作指针,可让读者能够透彻理解与模块相关的方方面面,不仅知其然,而且知其所以然。除此之外,本章还介绍了核心模块如何加载的过程,以及Apache模块通信所采用的各种策略,包括简单通信方式、可选函数通信方式及提供者API方式。本章最后对Apache中的一些常用模块进行了简单介绍。
第5章 多任务并发处理
Apache能够同时处理大量的并发连接,这得益于Apache的MPM模块。MPM将网络连接相关的处理独立成为模块的形式,这样不同的平台可以使用不同的并发模型,从而达到最优的效果。本章重点讨论了Prefork MPM、Worker MPM和WinNT MPM三种并发模型。
第6章 网络连接
本章介绍了连接处理相关的内容。首先介绍了连接处理的4个阶段,并详细介绍了等待连接阶段的创建套接字和侦听套接字的流程。在连接处理阶段则介绍了创建连接和读取连接的细节。在接收到连接后,就需要从连接中读取HTTP请求。本章最后一节讨论了请求读取的细节,包括如何读取HTTP请求行、请求头及请求报文体。
第7章 过滤器
对于客户端输入,Apache 并不一定会原封不动地提交给核心模块去处理,它可能要经过一些其他处理后才会提交给核心模块;与此相同,核心生成的内容也不会原封不动地发送给客户端,也可能会经过一些转换。对于输入和输出的内容进行转换处理是由过滤器完成的。本章详细介绍了过滤器的基本概念、过滤器在核心的组织结构、过滤器的使用及智能过滤器的概念和使用。
第8章 存储段和存储段组
当数据在过滤器中流动传递的时候,数据是以存储段组的形式组织的。每一个存储段组包含多个存储段,每一个存储段是一种数据类型的抽象。本章详细介绍了核心提供的11种存储段类型及它们的操作接口。同时还介绍了存储段的操作细节和内部实现细节。本章最后介绍了存储段组是如何与过滤器结合在一起使用的。
第9章 常用过滤器
本章介绍了常用的过滤器,包括网络处理的 CORE_IN、CORE 过滤器,Chunk 编码的Chunk过滤器。本章最后,我们引导读者编写了一个关键字高亮过滤器和题头题尾添加过滤器。通过本章的学习,读者可以很容易实现自己的新的过滤器。
本书的阅读方法
本书的厚度和难度并不适合一口气读完,而且本书源代码分析的特性决定了仅仅阅读本书还不够,必须在基于浏览代码的基础上同步阅读本书。
本书的Apache代码基于2.2.8版本,读者在阅读之前请去http://httpd.apache.org下载一份代码。对于阅读和分析代码,笔者推荐使用的工具是SourceInsight。
理解代码的最好方式就是跟踪和调试。因此勤于调试能有助于你对Apache源代码和本书内容的理解。
另外本书中的代码并不是与实际代码一一对应的。为了节省版面,大部分代码中的注释和日志记录代码都被剔除,不过日志对于阅读代码还是非常有益的,通过错误提示,能够帮助你理解上下文操作的背景。
作者联系方式
本书大部分内容都可以在笔者的博客(http://blog.csdn.net/tingya)上找到,只是没有经过整理。如果您有什么想法和意见可以到博客上去留言。
感谢
从2003年开始酝酿到本书出版,已经整整6年过去了。在这6年里,真心感谢那些陪伴自己走过的人。
首先要感谢的是我的妻子。每个夜晚,每个周末我伏案写作无暇陪她,她也毫无怨言。
感谢我的导师齐勇教授,在我读研没空顾及项目的时候,他给了我一次又一次的鼓励,他甚至想为我的兴趣单独申请一个课题。在齐勇教授的身边,我学会了很多专业知识以外的东西。
感谢我的同学和朋友温辉敏,每当我几乎要退却的时候,他总能及时提醒我,督促我,没有他,也许大家还要多等一些时候。
感谢腾讯的刘海宝,当本书还是草稿的时候,他就是本书的第一个忠实读者,并且为本书提供了一些有价值的意见。
感谢51.com IM事业部的同事们,在与你们相处的工作中非常愉快和开心,也希望你们能够谅解我在本书上投入的过多精力,他们是但汉权、胡佳佳、胡名雨、郭祥洲、刘庆平、尹波、易念华、张剑波、赵宏华。
感谢本书的编辑周筠和陈元玉,感谢她们给我的一贯支持,在因故延后交稿的时候,她们仍然在耐心地等待,感谢她们编辑本书付出的辛勤劳动!感谢杨福川编辑,正是他才使得本书的出版成为可能。
感谢您在茫茫的书海中选择了本书,并衷心祝愿您能从本书中受益。
升东网络科技发展(上海)有限公司 高级工程师 张中庆
2009年3月于上海