节选自《Apache源代码解析-基于Apache0.6.5》第一章。
Apache作为世界排名第一的Web服务器,运行在全球一半以上提供Web服务的服务器上。
最早的Apache版本(0.6.2)由Apache group于1995年4月发布。目前最新版本是2.2.11。目前能从网上找到的最古老的版本是0.6.5,也就是我们要讨论的版本。
1.1编译环境
本书中提供的代码在CentOS4.5下成功编译通过。目前主流硬件设备都可以编译运行,如果您没有相应的硬件资源,可以使用虚拟机来编译测试。关于虚拟机的使用网上有很多介绍的文章,过程都比较简单,这里不再赘述。
在Linux系统中,可以通过uname –a命令来查看当前使用系统的内核版本,作者的服务器输出如下:
[devel@RIZI ~]$ uname -a
Linux RIZI 2.6.9-55.ELsmp #1 SMP Wed May 2 14:28:44 EDT 2007 i686 i686 i386 GNU/Linux
相对应的gcc版本:
[devel@RIZI ~]$ gcc -v
gcc version 3.4.6 20060404 (Red Hat 3.4.6-8)
[devel@RIZI ~]$
1.2代码结构
本书中的代码是经过裁剪的Apache0.6.5,我们一般接触的服务器是Linux,所以和其它系统相关的部分裁剪掉了,这些部分包括对IBM、HP甚至于SONYBSD系统的适配,这些代码对初学者来说可能会造成困惑,以至于影响我们对整个服务器的学习。
另外删减了协商视图的部分,这部分不是Web服务器的核心功能,一般很少使用,并且目前最主流的浏览器IE不会在头信息里面给出有助于服务器提供该服务的信息。
代码中有一些错误,作者也进行了相应的修改,在代码的注释里面会提到。
本书介绍的代码可以从http://www.oldapache.org/sourcecode/apache0.6.5.rar 获取。
把下载的文件解压缩后,可以看到里面包含了6个目录,分别是src、conf、htdocs、cgi-bin、icons和logs。其中src目录中就是Apache的源代码,其它目录功能在1.3节中说明。
Apache0.6.5源代码共包括20个文件,按功能可以分成几大部分,如表1-1所示:
表1-1 Apache0.6.5 源代码功能分类
功能模块 | 包括代码 | 代码功能 |
编译辅助 | Makefile | 处理工程编译(类似批处理)。 |
日志记录 | http_log.c | 记录Apache运行中的各种日志。 |
工具集 | util.c、stream.h、stream.c | util.c定义实现了一些工具函数,这些函数供其它功能模块调用。 stream.h和stream.c实现了通过数据流缓冲读写文件的功能 |
主程序 | httpd.c | Apache主流程 |
配置读取 | http_config.c | 读取Apache配置文件内容并初始化本地变量 |
处理请求 | http_request.c、http_get.c、http_put.c、http_post.c http_delete.c | http_request.c处理客户端请求的主流程,它会根据用户请求的方法种类调用其它几个文件中定义的方法来应答客户端的请求。 |
脚本处理 | http_script.c | 处理用户对cgi脚本的请求并返回执行结果 |
SSI模块 | http_include.c | 处理客户端请求中的SSI代码,并返回执行结果 |
列表文件夹 | http_dir.c | 针对列表文件夹的处理 |
目录别名 | http_alias.c | 处理配置文件中设置的目录别名 |
存取控制和认证 | http_access.c、http_auth.c | 对客户端的访问请求进行验证 |
MIME | http_mime.c | 针对MIME的处理 |
1.3编译并运行Apache
根据1.2中给出的地址下载Apache0.6.5。在您的服务中创建一个devel的用户(也可以使用其它非root用户,作者使用的是devel用户,书中内容针对devel用户,如果您使用的是其它用户,请做相应修改)。
在目录/home/devel下创建apache_0.6.5目录,并将1.2节中下载的文件解压缩到该目录,此时的目录结构应该如下所示:
[devel@RIZI apache_0.6.5]$ pwd
/home/devel/apache_0.6.5
[devel@RIZI apache_0.6.5]$ ls
cgi-bin conf htdocs icons logs src
[devel@RIZI apache_0.6.5]$
在目录/home/devel/apache_0.6.5/src下执行make,如果没有出错,输出应该类似于:
[devel@RIZI src]$ pwd
/home/devel/apache_0.6.5/src
[devel@RIZI src]$ make
gcc -c -O2 http_config.c
…… …… ……
gcc -c -O2 stream.c
gcc -lcrypt -o httpd http_config.o httpd.o http_request.o util.o http_dir.o http_alias.o http_log.o http_mime.o http_access.o http_auth.o http_get.o http_post.o http_script.o http_include.o http_put.o http_delete.o stream.o
[devel@RIZI src]$ ls
http_access.c http_auth.o …… http_alias.o httpd
[devel@RIZI src]$
编译成功,在目录下生成一堆.o文件及httpd文件,httpd文件即最终可执行的Apache web服务器程序。
Apache运行需要一些配置文件,这些文件存放着conf目录中;logs目录中存放Apache运行过程中产生的日志文件,htdocs是您网站的根 目录,cgi-bin可以放置cgi脚本,icons目录存放网站中可能使用到的图标,。这些目录名称可以和上面所列的名称不同,如果不同,需要重新设置 Apache的配置文件并修改源代码中的相关配置信息,暂时不建议这样做。
现在可以试着运行你的Apache了,在src目录下执行./httpd,可以看到结果类似于:
[devel@RIZI src]$ ./httpd
[devel@RIZI src]$ ps x
PID TTY STAT TIME COMMAND
8739 ? Ss 0:00 ./httpd
10248 pts/2 R+ 0:00 ps x
……
[devel@RIZI src]$
此时Apache已经成功运行,您可以打开浏览器,在地址栏里面输入http://yourip:port/ (如http://127.0.0.1:8181)来查看Apache的运行效果。
注:为了不合现有的服务冲突,在您下载的压缩包里,配置文件中配置的Apache的监听端口为8181。
如果没有意外,将会看到这样的界面:
如果您没有看到上面的画面,请参照前面的步骤确定您的每个操作。
如果您看到了上面的画面,那么恭喜您,您的环境已经搭建成功,接下来,我们将要进入Apache源代码的神奇世界,下一张我们将要讲述Apache的主程序httpd.c。Are you ready?Let’s go!
节选自《Apache源代码解析-基于Apache0.6.5》第一章。