Web服务器会做些什么
(1) 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
(2) 接收请求——从网络中读取一条HTTP 请求报文。
(3) 处理请求——对请求报文进行解释,并采取行动。
(4) 访问资源——访问报文中指定的资源。
(5) 构建响应——创建带有正确首部的HTTP 响应报文。
(6) 发送响应——将响应回送给客户端。
(7) 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
第一步——接受客户端连接
处理新连接
客户端请求一条到Web 服务器的TCP 连接时,Web 服务器会建立连接,判断连接的另一端是哪个客户端,从TCP 连接中将IP 地址解析出来。
客户端主机名识别
可以用“反向DNS”对大部分Web 服务器进行配置,以便将客户端IP 地址转换成客户端主机名
例5-2 配置Apache,为HTML 和CGI 资源查找主机名
HostnameLookups offHostnameLookups on
通过ident确定客户端用户
第二步——接收请求报文
解析请求报文时,Web 服务器会:
• 解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号, 各项之间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束
• 读取以 CRLF 结尾的报文首部;
• 检测到以 CRLF 结尾的、标识首部结束的空行(如果有的话);
• 如果有的话(长度由 Content-Length 首部指定),读取请求主体。
解析请求报文时,Web 服务器会不定期地从网络上接收输入数据。网络连接可能随时都会出现延迟。Web 服务器需要从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止
报文的内部表示法
连接的输入/输出处理结构
高性能的Web 服务器能够同时支持数千条连接
因为请求可能会在任意时刻到达,所以Web 服务器会不停地观察有无新的Web 请求。不同的Web 服务器结构会以不同的方式为请求服务。
• 单线程 Web 服务器
单线程的Web 服务器一次只处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接。这种结构易于实现,但在处理过程中,所有其他连接都会被忽略。这样会造成严重的性能问题,只适用于低负荷的服务器,以及
type-o-serve 这样的诊断工具。
• 多进程及多线程 Web 服务器
多进程和多线程Web 服务器用多个进程,或更高效的线程同时对请求进行处理。5可以根据需要创建,或者预先创建一些线程/ 进程。6 有些服务器会为每条连接分配一个线程/ 进程,但当服务器同时要处理成百、上千,甚至数以万计的连接时,需要的进程或线程数量可能会消耗太多的内存或系统资源。因此,很多多线程Web 服务器都会对线程/ 进程的最大数量进行限制。
• 复用 I/O 的服务器
为了支持大量的连接,很多Web 服务器都采用了复用结构。在复用结构中,要同时监视所有连接上的活动。当连接的状态发生变化时(比如,有数据可用,或出现错误时),就对那条连接进行少量的处理;处理结束之后,将连接返回到开放连接列表中,等待下一次状态变化。只有在有事情可做时才会对连接进行处理;在空闲连接上等待的时候并不会绑定线程和进程。
• 复用的多线程 Web 服务器
有些系统会将多线程和复用功能结合在一起,以利用计算机平台上的多个CPU。多个线程(通常是一个物理处理器)中的每一个都在观察打开的连接(或打开的连接中的一个子集),并对每条连接执行少量的任务。
第三步——处理请求
一旦Web 服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对请求进行处理了。
有些方法(比如POST)要求请求报文中必须带有实体主体部分的数据。其他一些方法(比如OPTIONS)允许有请求的主体部分,也允许没有。少数方法(比如GET)禁止在请求报文中包含实体的主体数据。
第四步——对资源的映射及访问
Web 服务器是资源服务器。它们负责发送预先创建好的内容,比如HTML 页面或JPEG 图片,以及运行在服务器上的资源生成程序所产生的动态内容。
1、docroot
Web 服务器支持各种不同类型的资源映射,但最简单的资源映射形式就是用请求URI 作为名字来访问Web 服务器文件系统中的文件。通常,Web 服务器的文件系统中会有一个特殊的文件夹专门用于存放Web 内容。这个文件夹被称为文档的根目录(document root,或docroot)。Web 服务器从请求报文中获取URI,并将其附加在文档根目录的后面。
有一条对/specials/saw-blade.gif 的请求到达。这个例子中Web 服务器的文档根目录为/usr/local/httpd/files。Web 服务器会返回文件/usr/local/httpd/files/specials/saw-blade.gif。
Apache Web 服务器虚拟主机的docroot 配置ServerName www.joes-hardware.com
DocumentRoot/docs/joe
TransferLog/logs/joe.access_log
ErrorLog/logs/joe.error_log
ServerName www.marys-antiques.com
DocumentRoot/docs/mary
TransferLog/logs/mary.access_log
ErrorLog/logs/mary.error_log...
第五步——构建响应
响应实体
• 描述了响应主体 MIME 类型的 Content-Type 首部;
• 描述了响应主体长度的 Content-Length 首部;
• 实际报文的主体内容。
• MIME 类型(mime.types)
第六步——发送响应
第七步——记录日志