实际的Web服务器处理客户端请求的步骤分析

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

接受一个客户端链接,或者若是不但愿与这个客户端创建链接,就将其关闭。html

第二步——接收请求报文

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

解析报文

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

报文的内部表示法

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

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

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

单线程Web服务器

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

多进程及多线程Web服务器

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

复用I/O的服务器

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

复用的多线程Web服务器

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

第三步——处理请求

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

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

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

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服务器都提供了几种日志配置格式。

相关文章
相关标签/搜索