Blog Email GitHub

03 Jun 2010
The Apache Paltform and Architecture

上个星期算是将APUE粗略看了一遍,写了个简易的http server(算是弥补下实习时候的遗憾),写完后发现自己对文件描述符的理解还不是特别透彻,特别是多进程共享的时候(很早以前觉得APUE必须重新精读一遍)。很想知道Apache是如何实现多进程并发,无奈源代码苦涩难懂,不知从而看起(应了linus的那句话Read The Fuck Soucing Code)。进而转向看文档The Apache Modules Book。看完第二章The Apache Paltform and Architecture,我彻底拜服,拜服于apache的架构。下面就谈谈对apache architecture的了解。

Apache HTTP server由APR、Apache HTTPD、mpm、modules、The Third Libraries几部分构成。《Apache 源代码全景分析》中分的更细,将Apache划分为四个大的层次:
  1. 可移植性运行库层(APR)
  2. Apache核心功能层(Apache CORE)
  3. Apache可选功能层(Apache Optional Module)
  4. Apache第三方支持库
《Apache源代码全景分析》为何没有列出mpm?我想是把Apache HTTPD、mpm和一些必要的modules归结成Apache CORE。Apache为何这样设计,下面就详细说说各个层次的用处和这样设计的目的:
  • APR。由于各个操作系统提供的底层API是不同的,甚至存在着很大的差异。如果没有APR,Apache设计者就必须关心各个操作系统API细节之间的不同。采用APR就是将不同操作系统的底层细节封装起来形成操作系统API的适配并将其隐藏起来。这样Apache CORE建立在APR上,能够满足不同操作系统的要求。(说明:APR并不是只为Apache使用,任何想跨平台的软件工程,都可以拿来用)
  • Apache HTTPD的主要功能是启动和停止Apache,处理配置文件,接受和处理HTTP连接,读取HTTP请求并对该请求进行处理、处理HTTP协议等。
Apache HTTPD和modules之间的关系是调用和被调用的关系,所有的模块都直接和核心进行交互。调用是通过Apache HOOK实现的,这样处理的好处是:Apache HTTPD不用关心模块的多少,模块到底如何实现,直接调用即可,用户可以随时加载新的模块或者卸载模块,不仅降低耦合,并且扩展性极好。