Apache源代码的结构,Apache源代码结构


    • 前言
    • Apache的源代码的结构
    • Apr
      • 抽象和封装
      • Socket调度
    • Pcre
    • 总结
    • 参考资料

前言

Apache的源代码已经下载完毕了,在上一篇博客中也简单的进行了一下编译安装。但是安装中涉及到的apr,pcre到底有啥作用还是不清楚,而且也不知道Apache源代码的大概结构,因此首先要做一下这方面的工作

Apache的源代码的结构


|-- build      安装脚本
|    |-- pkg
|    |-- rpm
|    `-- win32
|-- docs      文档
|    |-- cgi-examples
|    |-- conf
|    |-- docroot
|    |-- error
|    |-- icons
|    |-- man
|    `-- manual
|-- include   头文件
|-- modules      apache模块
|    |-- aaa      各种auth,都是a开头的,所以叫aaa?
|    |-- arch     和系统相关的mod
|    |-- cache    缓存相关。disk/file/mem cache
|    |-- database mod_dbd是用来连接关系数据库的
|    |-- dav       mod_dav
|    |-- debug    几个调试相关的mod mod_dumpio mod_bucketeer
|    |-- echo      代码很短。这个mod应该是mod开发参考用的吧
|    |-- experimental mod_example是一个注释很详细的mod,果然是mod——example
|    |-- filters     过滤器:mod_filter
|    |-- generators 处理器mod: asis info cgi(d) status autoindex suexec
|    |-- http       mod_mine : 根据文件扩展名决定应答的行为和内容
|    |-- ldap       mod_ldap : 提供ldap连接
|    |-- loggers    各种日志 :mod_logconfig mod_log_forensic mod_logio
|    |-- mappers    在客户端到generator过程中进行重定向的许多mod
|    |-- metadata 感觉像Miscellaneous,许多东西,不知道为什么放在一起
|    |-- proxy      自然是mod_proxy,将请求proxy到其他程序
|    |-- ssl        提供ssl连接
|    `-- test
|-- os         操作系统相关的东西,各个不同的操作系统需要定义各自的宏,还有少量特别的函数
|    |-- beos
|    |-- bs2000
|    |-- netware
|    |-- os2
|    |-- tpf
|    |-- unix
|    `-- win32
|-- server   apache核心程序httpd就是这里来的
|    `-- mpm
|-- srclib   
|    |-- apr   apr和apr-util是apache的底层库,强调的是Portable
|    |-- apr-util
|    `-- pcre   PCRE是一个Perl库,包含了perl兼容的正规表达式库
|-- support    apache运行的一些工具,bin里面除了httpd几乎都在这里了
|    |-- SHA1
|    `-- win32
`-- test

因为我主要是想了解Apache的工作流程,所以主要集中在server这一部分,其中apache http server的内存管理写的非常好,所以这一部分会格外重点的看一看。

Apr

apr到底是啥?有什么作用?为什么安装apache http server必须要安装apr?这是我在编译安装apache的时候的疑惑。
查阅资料,发现主要有两种:

抽象和封装

APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期 的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。

随着Apache的进一步开 发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,不过由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目比如 Flood loader,该项目用于服务器压力测试(不仅仅适用于Apache)、FreeSwitch,JXTA-C(C版本的JXTA点对点平台实现);商业的项目则包括Blogline,covalent等等。

APR使得平台细节的处理进行下移。对于应用程序而言,它们根本就不需要考虑具体的平台,不管是Unix、Linux还是Window,应用程序执行的接口基本都是统一一致的。因此对于APR而言,可移植性和统一的上层接口是其考虑的一个重点。而APR最早的目的并不是如此,它最早只是希望将Apache中用到的所有代码合并为一个通用的代码库,然而这不是一个正确的策略,因此后来APR改变了其目标。有的时候使用公共代码并不是一件好事,比如如何将一个请求映射到线程或者进程是平台相关的,因此仅仅一个公共的代码库并不能完成这种区分。APR的目标则是希望安全合并所有的能够合并的代码而不需要牺牲性能。

apache 的apr项目目前有三部分组成,分别是apr、apr-util、apr-iconv

  • apr中包含了一些通用的开发组件,包括mmap,DSO等等,

  • apr-util该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等。

  • apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。

Socket调度

要测APR给tomcat带来的好处最好的方法是在慢速网络上(模拟Internet),将Tomcat线程数开到300以上的水平,然后模拟一大堆并发请求。如果不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待。但是配上APR之后,并发的线程数量明显下降,从原来的300可能会马上下降到只有几十,新的请求会毫无阻塞的进来。

APR对于Tomcat最大的作用就是socket调度。

你在局域网环境测,就算是400个并发,也是一瞬间就处理/传输完毕,但是在真实的Internet环境下,页面处理时间只占0.1%都不到,绝大部分时间都用来页面传输。如果不用APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用apr是非常必要的。

Pcre

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。这些在执行正规表达式模式匹配时用与Perl5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度明显变慢。测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒。因此改用pcre来解决C语言中使用正则表达式的问题

总结

虽然我只想大概了解一下apache的源代码的工作流程,对于apr的具体实现不需要看,但是这一篇博客主要是为了做一些准备工作。

apr的具体细节虽然不需要了解,但是这种设计思想是值得学习的——把涉及分层、不断抽象封装。

后面的学习主要通过阅读文档、对源代码进行修改观察输出和效果等方式来实现的,因此为了更好的观察到效果,还要对apache的一些常用的配置等进行学习。

参考资料

这一篇文章主要参考了三位前辈的文章,在此列出原文地址,并表示感谢。

  • apache源码目录结构:
    http://blog.csdn.net/Com_ma/article/details/77940261

  • apache apr介绍:
    http://blog.sina.com.cn/s/blog_64d912e801018anp.html

  • apache安装apr和apr-util作用:
    http://blog.51cto.com/wgkgood/432272

相关内容

    暂无相关文章