Apache源代码全景分析(第1卷):体系结构与核心模块
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 HTTP服务器

1.2.1 HTTP服务器简介

如果你要了解一个软件产品,最好的主意就是了解该软件能够实现什么样的功能。对服务器应用程序而言,通常要了解四方面的内容:客户端、服务器端、客户端和服务器端的协议及服务器端能够提供的资源。这一点对于HTTP服务器也不例外。

整个 Web 可以分为两个重要的组成部分:客户端和服务器端。当客户端需要请求特定的URI时,它将与服务器建立连接,并通过HTTP协议发送请求至Web服务器。Web服务器接收到客户端的请求之后将生成响应内容,同时将该响应内容通过连接返回给客户端。浏览器和服务器之间的通信过程可以用图1-3进行说明。

图1-3 浏览器/服务器通信过程示意图

1.2.2 HTTP服务器功能

正常情况下,一个HTTP服务器会等待浏览器发送的请求,并根据HTTP协议进行响应。客户端总是请求某个特定的文档。服务器将检查该请求,同时将客户端请求的文档映射到服务器本地的文件系统中,或者将该请求转发给一个特定的应用程序,并由该应用程序负责对请求进行处理,生成响应内容。一旦处理完毕,服务器将把处理结果返回给客户端。

图1-4的左侧部分演示了一个非常简单的系统结构:用户与浏览器打交道,浏览器接受用户的输入和数据,然后将请求发送到HTTP请求服务器,而请求服务器则从磁盘上读取客户端需要的文件,再发送给客户端。

图1-4 HTTP服务器流程

图1-4的右侧部分描述了系统中发生的内容:用户在浏览器中输入URL或点击某个超链接,浏览器从输入的URL或超链接中获取服务器地址,然后与服务器建立TCP/IP连接。使用该连接,浏览器可以向HTTP服务器发送一个GET请求,服务器接收到该URL地址后从URL中提取出请求的资源名称。

HTTP 服务器读取请求并对请求进行处理,使用打开的 TCP/IP 连接,服务器在它的响应中发送客户端需要的资源,发送完毕后服务器将关闭该连接。浏览器接收到服务器返回的数据后,它将检测这些数据。HTML 文档中可以包含资源链接(比如图片、Flash 或 Java applets)。对于这些资源,客户端必须再次向服务器发送请求获取。一旦所有的内容都下载完毕后,浏览器就可以将这个HTML展现在浏览器中。

图1-5描述了HTTP服务器更多的细节:初始化之后,服务器就进入了请求——响应循环阶段,它将等待一个客户端请求,然后对该请求进行检查,将请求的URL 映射为特定的文件,如果该文件存在,则将该文件发送返回给客户端,如果不存在,则返回一个错误消息。

图1-5 HTTP服务器内部处理流程

图 1-5 所演示的只是一个最最简单的 Web 服务器,如果要实现对应的功能,不会超过200行代码。一个有用的Web服务器通常会更复杂,它们还会包含以下一些额外功能。

■ 完整地实现HTTP/0.9、HTTP/1.0及HTTP/1.1协议支持。

■ 能够处理并发请求,支持多进程或多线程。

■ 提供开发接口,允许开发人员自行增加额外的功能。

■ 服务器安全机制的实现。

■ 动态内容生成,允许服务器通过CGI、脚本语言(比如perl)和服务器端(包含SSI)生成动态的Web页面。

■ 支持虚拟主机。

■ 支持代理功能。

■ 允许根据MIME类型协商选择合适的返回资源。

从管理的角度而言,HTTP服务器还需要额外的要求,比如:

■ 健壮性和稳定性,支持7×24小时连续运行。

■ 易配置性。

■ 用户可以在不停止服务器的情况下修改配置。

■ 易管理性,管理员可以通过辅助工具对服务器进行有效的管理。

■ 丰富的日志。

1.2.3 WWW文档

WWW 服务器上的文档是以层状或树型结构进行组织的。与传统的层次化文件系统相比,文档树也有一个根,以及一些包含若干子目录和文件的目录。WWW服务器上的每个文档都有一个唯一的名字,该名字取自根“/”开始的路径,所以一个名为tree.htm的文件可能有一个类似/some/where/in/the/tree.html的完整名字。

但是需要特别注意的是:在WWW服务器上包含Web文档的文件实际上肯定有许多不同的组织方式。Web文档树只是反映了一个具有复杂结构的文档集的简单视图。这个简单视图作用重大:它帮助人们在复杂的服务器系统中查找需要的东西。

WWW服务器上的每个文档都是整个文档树的一部分。它们有各自的名字,从而使浏览器可以对它们包含的信息提出请求。HTML文档中的超链接,使用文档名来指向对应的信息。链接可以是完整的文档名字,如:

http://www.server.org/there/silly.html

或者是当前文档的名字,如:

./silly.gif

第二种方式表明 silly.gif 与包含该链接的文档处于同一路径中,也就是说,如果存在/there/silly.html,silly.gif的全名应该是http://www.server.org/there/silly.gif

相对名称通常用于内嵌的图像。一般来说,一个文档所包含的各个部分都在 WWW 服务器的同一地方。

需要强调的是,Web文档树并不能真实反映Web文档的组织结构。那么,Web文档为什么不组织成为简单的树型结构呢?这是由很多原因造成的。比如Web文档是由若干个小组分别制作的,它们每个都有自己的工作区和存储区;再如,Web文档太多,使得这些文档只保存在一个文件系统下甚至一台计算机上都显得过于庞大。Web 服务器的流行和高速发展,使得它有必要将文档分布到若干台服务器上,以提高整个Web系统的最大承受能力。

图1-6、图1-7、图1-8给出了WWW服务器上文档组织的三种最重要的形式。所有的文档可以位于同一台机器上,构成一棵树,也可以分散到几台机器上,还可以在不同的机器上对同一文档进行镜像。需要注意的是,尽管内部组织方式不同,但是对于用户而言,则没有任何的差异。

图1-6 Web服务器文档组织形式:所有文档位于同一机器上

图1-7 Web服务器文档组织形式:WWW的文档分布于不同的机器上,相互之间没有形成镜像

图1-8 Web服务器文档组织形式:WWW文档在不同的机器上形成镜像

1.2.4 工作方式

WWW服务器拥有一系列组织成文档树的信息,并遵循HTTP协议为客户服务。那么它是如何工作的呢?我们分步骤展示WWW服务器的工作原理。

等待客户请求

WWW服务器与其余的任何一个服务器都类似,它必须等待来自客户端的请求。服务器侦听一个指定的端口直到有请求进来。在处理请求之前,服务器处于休眠状态,此时可以用图1-9描述。

图1-9 Web服务器等待客户请求

客户请求到来

客户端通过浏览器对文档提出请求。用户可能是直接在浏览器中输入了 URI 地址,或者在浏览的时候点击了一个超链接。无论何种方式,请求最终都会发送给服务器,比如我们以http://www.apache.org/index.html作为示例。

浏览器负责查找服务器主机,并与之建立一条双向网络连接。实现这一点要依赖于Internet 上的诸多协议和域名服务器系统。一旦连接建立起来,浏览器便按照 HTTP 协议发出请求。在本示例中,用户访问的是 http://www.apache.org 主机上的 index.html,因此它向服务器端发出如下的ASCII字符串:

    GET/index.html HTTP/1.0

这些字符串经过网上传输,被服务器接受并保存到内存中,图 1-10 演示了客户端与WWW服务器连接请求的发送。

图1-10 客户端和服务器的连接请求发送

接受客户请求

WWW服务器对请求按照HTTP协议进行解码来确定进一步的动作,涉及的内容包括三方面:方法(GET)、客户端所要请求的文档(/index.html),以及浏览器使用的协议(HTTP/1.0)。其中方法告诉服务器应该完成的动作,GET 方法的含义很显然是:服务器应定位、读取文件并将它返回给客户端。

WWW 服务器现在已经知道它应该找到/index.html,并使用 HTTP/1.0 协议将内容返回给客户。信息是经过与请求到来时相同的连接发出的,所以服务器不需要重新建立与客户端的连接。

读取其他信息

WWW服务器根据需要去读取请求的其他部分。在HTTP/1.0下,客户还应该给服务器提供关于它的一些信息。元信息可用来描述浏览器及其能力,以使服务器根据它确定如何返回应答。在本例中,还有如下请求信息:

    User-agent:Mosaic for X Windows/2.4
    Accept: text/plain
    Accept: text/html
    Accept: image/*

这些内容表明浏览器是NCSA Mosaic,它可以显示文本及任意图像。

完成请求的其余动作

如果没有任何错误发生,WWW服务器将执行请求所要求的动作。要获取(GET)一个文档,WWW服务器在其文档树中搜索请求的文件index.html,这是由服务器上作为操作系统一部分的文件完成的。如果文件能找到并可正常读取,服务器则将其返回给客户端,如图1-11所示。

图1-11 客户端和服务器的连接请求发送

如果成功,文件将被发送出去。首先,WWW服务器将发送一个响应码及一些描述信息。既然文件已经找到,响应码为 200,表示一切正常(OK),文档随后发出。由于发送的是HTML文档 ,所以Content-type为text/html。文档长度为1 066个字节,同时Content-length为1 066。服务器软件的标识及文档的时间属性也被包含在对应的头域中,如下所示:

    HTTP/1.0 200 Document follows
    Server:Apache/1.3.6
    Date:Thu,20 Jul.1998 22:00:00 GMT
    Content-type:text/html
    Content-length:1066
    Last-modified:Thu,20 Jul,1998 22:00:00 GMT

在给出这些描述信息之后,WWW服务器便从磁盘上读取该index.html文件,并将其输出到网络中。

如果处理失败,WWW服务器将返回错误提示信息。通常最主要的错误是请求的文件在WWW服务器中找不到,或者找到无法读取,那么此时返回不同于200的其余错误码,比如403,意味着请求的文件不存在,这样响应信息就变化为如下所示:

    HTTP/1.0 403 Not Found
    Server:Apache/1.3.6
    Date:Thu,20 Jul.1998 22:00:00 GMT
    Content-type:text/html
    Content-length:0

关闭文件和网络连接,结束会话

在文件已经发出或错误指示已经发出后,WWW服务器将结束整个会话,它关闭打开的被请求的文件,关闭网络端口,从而结束网络延迟。有关的其他工作则是由客户端来完成的,包括接收数据,并将这些数据以可读的方式布局在浏览器中。这些都与服务器无关。