不管是在日常的开发、发布Web程序还是浏览网页,我们都离不开Web服务器。《Http权威指南》的5.3节介绍了Web服务器会做些什么,特意做了此读书笔记。
如下图所示:
- 建立连接——接受客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
- 接收请求——从网络中读取一条HTTP请求报文。
- 处理请求——对请求报文进行解释,并采取行动。
- 访问资源——访问报文中指定的资源。
- 构建响应——创建带有正确首部的HTTP响应报文。
- 发送响应——将响应发送给客户端。
- 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
第一步——接受客户端连接
如果客户端已经打开一条道服务器的持久连接,可以使用那条连接来发送它的请求。否则,客户端需要打开一条新的到服务器的连接。
服务器处理新连接流程:
客户端请求TCP连接 –> Web服务器建立连接 –> 服务器判断是哪一个客户端,从TCP连接中解析出IP地址 –> 服务器将新连接添加到Web服务器连接列表中,监视连接上的数据传输
Web服务器可以随意拒绝或者立即关闭任意一条连接。
可以使用“反向DNS”对大部分Web服务器进行配置,以便将客户端IP地址转换成客户端主机名。(这样会降低Web事务处理的速度)
第二步——接收请求报文
连接上有数据到达时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。
不同的Web服务器结构会以不同的方式为请求服务:
- 单线程Web服务器:一次只能处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接。
- 多线程及多线程Web服务器:用多个进程,或更高效的线程同时对请求进行处理。
- 复用I/O的服务器:监控连接上所有的活动,当连接状态变化时进行处理;处理结束后,将连接返回到开发列表中。
- 复用的多线程Web服务器:将复用功能和多线程结合在一起。
第三步——处理请求
Web服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对请求进行处理了。
第四步——对资源的映射及访问
Web服务器是资源服务器。它们负责发送预先创建好的内容,以及运行在服务器上的资源生成程序所生产的动态内容。
Web服务器的文件系统中会有一个特殊的文件夹专门存放Web内容,叫文档的根目录(document root,docroot)。
第五步——构建响应
一旦Web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。
如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。如果有响应主体的话,响应报文中通常包括:
- 描述了响应主体MIME类型的Content-Type首部;
- 描述了响应主体长度的Content-Length首部;
- 实际报文的主体内容。
Web服务器有时会返回重定向响应而不是成功的报文。重定向可用于下列情况:
- 永久搬离的资源
- 临时搬离的资源
- URL增强
- 负载均衡
- 服务器关联
- 规范目录名称
第六步——发送响应
服务器有很多条到各个客户端的连接,有些空闲,有些在向服务器发送数据,有些在向客户端回送响应数据。服务器要记录连接的状态。
第七步——记录日志
事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。