第一步——接受客户端连接

接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。

第二步——接收请求报文

从网络中读取一条HTTP请求报文

解析报文

1. 解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号,各项之间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束;
2. 读取以CRLF结尾的报文首部;
3. 检测到以CRLF结尾的、标识首部结束的空行(如果有的话);
4. 如果有的话(长度由Content-Length首部指定),读取请求主体。

报文的内部表示法

有些Web服务器还会用便于进行报文操作的内部数据结构来存储请求报文

连接的输入/输出处理结构

不同的Web服务器结构会以不同的方式为请求服务

单线程Web服务器

一次只处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接

多进程及多线程Web服务器

服务器会为每条连接分配一个线程/进程;但当服务器同时要处理成百、上千,甚至数以万计的连接时,需要的进程或线程数量可能会消耗太多的内存或系统资源。因此,很多多线程Web服务器都会对线程/进程的最大数量进行限制。

复用I/O的服务器

Web服务器都采用了复用结构。在复用结构中,要同时监视所有连接上的活动。当连接的状态发生变化时(比如,有数据可用,或出现错误时),就对那条连接进行少量的处理;处理结束之后,将连接返回到开放连接列表中,等待下一次状态变化。只有在有事情可做时才会对连接进行处理;在空闲连接上等待的时候并不会绑定线程和进程。

复用的多线程Web服务器

有些系统会将多线程和复用功能结合在一起,以利用计算机平台上的多个CPU。多个线程(通常是一个物理处理器)中的每一个都在观察打开的连接(或打开的连接中的一个子集),并对每条连接执行少量的任务

第三步——处理请求

对请求报文进行解释,并采取行动,比如post可能提交了一些信息,服务器需要来处理这些信息

第四步——对资源的映射及访问

访问报文中的指定资源,比如Get请求根据地址映射获取服务器上的某个文件。

docroot

通常,Web服务器的文件系统中会有一个特殊的文件夹专门用于存放Web内容。这个文件夹被称为文档的根目录(document root,或docroot)。Web服务器从请求报文中获取URI,并将其附加在文档根目录的后面。
很多web服务器都支持配置document 在配置文件httpd.conf中添加一个DocumentRoot行就可以为Apache Web服务器设置文档的根目录了:
DocumentRoot /usr/local/httpd/files

虚拟托管的docroot

虚拟托管的Web服务器会在同一台Web服务器上提供多个Web站点;每个站点在服务器上都有自己独有的文档根目录。虚拟托管Web服务器会根据URI或Host首部的IP地址或主机名来识别要使用的正确文档根目录。通过这种方式,即使请求URI完全相同,托管在同一Web服务器上的两个Web站点也可以拥有完全不同的内容了。

解析目录

我们可以对大多数Web服务器进行配置,使其在客户端请求目录URL时采取不同的动作。

1. 返回一个错误。
2. 不返回目录,返回一个特殊的默认“索引文件”(Web服务器可自行配置索引优先级)。
3. 扫描目录,返回一个包含目录内容的HTML页面(自动生成且返回一个展示目录下的所有文件/目录的html文件)。

大多数Web服务器都会去查找目录中一个名为index.html或index.htm的文件来代表此目录。如果用户请求的是一个目录的URL,而且这个目录中有一个名为index.html(或index.htm)的文件,服务器就会返回那个文件的内容。

第五步——构建响应

一旦Web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。

响应实体

如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。
响应报文中通常包括:

1. 描述了响应主体MIME类型的Content-Type首部;
2. 描述了响应主体长度的Content-Length首部;
3. 实际报文的主体内容。

重定向

Web服务器有时会返回重定向响应而不是成功的报文。Web服务器可以将浏览器重定向到其他地方来执行请求。重定向响应由返回码3XX说明。Location响应首部包含了内容的新地址或优选地址的URI。重定向可用于下列情况。

永久搬离的资源

资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的URL。态码301Moved Permanently就用于此类重定向。

临时搬离的资源

如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。状态码303 See Other以及状态码307 Temporary Redirect就用于此类重定向。

URL增强

服务器通常用重定向来重写URL,往往用于嵌入上下文。当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的URL,并将用户重定向到这个新的URL上去。[插图]客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整的、经过状态增强的URL。这是在事务间维护状态的一种有效方式。状态码303 See Other和307 Temporary Redirect用于此类重定向。

负载均衡

如果一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。状态码303 See Other和307 TemporaryRedirect可用于此类重定向。

第六步——发送响应

将响应报文返回给客户端

第七步——记录日志

最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。大多数Web服务器都提供了几种日志配置格式。


star
64 声望3 粉丝

小菜鸟成长记录