Web 服务器实现了 HTTP 和相关的 TCP 连接处理。 负责管理 Web 服务器提供的资源, 以及对 Web 服务器的配置、 控制及扩展方面的管理。
我的专栏: HTTP学习笔记
Web服务器会做些什么
(1) 建立连接——接受一个客户端连接, 或者如果不希望与这个客户端建立连接, 就将其关闭。
(2) 接收请求——从网络中读取一条 HTTP 请求报文。
(3) 处理请求——对请求报文进行解释, 并采取行动。
(4) 访问资源——访问报文中指定的资源。
(5) 构建响应——创建带有正确首部的 HTTP 响应报文。
(6) 发送响应——将响应回送给客户端。
(7) 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
(1)建立连接
处理新连接
客户端请求一条到 Web 服务器的 TCP 连接时, Web 服务器会建立连接, 判断连接的另一端是哪个客户端, 从 TCP 连接中将 IP 地址解析出来。建立相应连接,并监视数据上传。同时,Web 服务器可以随意拒绝或立即关闭任意一条连接。
客户端主机名识别
可以用“反向 DNS” 对大部分 Web 服务器进行配置, 以便将客户端 IP 地址转换成客户端主机名。
通过ident确定客户端用户
ident 在组织内部可以很好地工作, 但出于多种原因, 在公共因特网上并不能很好地工作, 原因包括:
• 很多客户端 PC 没有运行 ident 识别协议守护进程软件;
• ident 协议会使 HTTP 事务处理产生严重的时延;
• 很多防火墙不允许 ident 流量进入;
• ident 协议不安全, 容易被伪造;
• ident 协议也不支持虚拟 IP 地址;
• 暴露客户端的用户名还涉及隐私问题。
(2)接收请求
解析请求报文时, Web 服务器会:
• 解析请求行, 查找请求方法、 指定的资源标识符(URI) 以及版本号, 各项之间由一个空格分隔, 并以一个回车换行(CRLF) 序列作为行的结束;
• 读取以 CRLF 结尾的报文首部;
• 检测到以 CRLF 结尾的、 标识首部结束的空行(如果有的话) ;
• 如果有的话(长度由 Content-Length 首部指定), 读取请求主体。
Web服务器输入/输出结构
单线程 Web 服务器:单线程的 Web 服务器一次只处理一个请求, 直到其完成为止。 一个事务处理结束之后, 才去处理下一条连接。
多进程及多线程 Web 服务器:多进程和多线程 Web 服务器用多个进程,或更高效的线程同时对请求进行处理。可以根据需要创建, 或者预先创建一些线程 / 进程。
复用 I/O 的服务器:为了支持大量的连接, 很多 Web 服务器都采用了复用结构。 在复用结构中, 要同时监视所有连接上的活动。
复用的多线程 Web 服务器:有些系统会将多线程和复用功能结合在一起, 以利用计算机平台上的多个 CPU。多个线程(通常是一个物理处理器) 中的每一个都在观察打开的连接(或打开的连接中的一个子集), 并对每条连接执行少量的任务。
![](https://i-blog.csdnimg.cn/blog_migrate/40bcb5556eb4ff607e9c3f21a3d72ec8.png)
(3) 处理请求
一旦 Web 服务器收到了请求, 就可以根据方法、 资源、 首部和可选的主体部分来对请求进行处理了。
(4) 访问资源
Web 服务器支持各种不同类型的资源映射, 但最简单的资源映射形式就是用请求URI 作为名字来访问 Web 服务器文件系统中的文件。
docroot
document root,顾名思义,文档的根目录
虚拟托管的docroot
虚拟托管的 Web 服务器会在同一台 Web 服务器上提供多个 Web 站点, 每个站点在服务器上都有自己独有的文档根目录。 虚拟托管 Web 服务器会根据 URI 或 Host 首部的 IP 地址或主机名来识别要使用的正确文档根目录。
服务器可以通过 HTTP 的 Host 首部, 或根据不同的 IP 地址来区分不同的Web 站点。
• 当请求 A 到达时, 服务器会获取文件 /docs/joe/index.html。
• 当请求 B 到达时, 服务器会获取文件 /docs/mary/index.html。
对常见的Apache Web 服务器来说, 需要为每个虚拟 Web 站点配置一个 VirtualHost 块, 而且每个虚拟服务器都要包含 DocumentRoot。
用户的主目录docroot
Docroot 的另一种常见应用是在 Web 服务器上为人们提供私有的 Web 站点。 通常会把那些以斜杠和波浪号(/~) 开始。
Web 服务器可以接收对目录 URL 的请求, 其路径可以解析为一个目录, 而不是文件。 我们可以对大多数 Web 服务器进行配置, 使其在客户端请求目录 URL 时采取不同的动作。
• 返回一个错误。
• 不返回目录, 返回一个特殊的默认“索引文件”。
• 扫描目录, 返回一个包含目录内容的 HTML 页面。
动态内容资源的映射
Web 服务器还可以将 URI 映射为动态资源——也就是说, 映射到按需动态生成内容的程序上去。
Apache 允许用户将 URI 路径名组件映射为可执行文件目录。 服务器收到一条带有可执行路径组件的对 URI 的请求时, 会试着去执行相应服务器目录中的程序。
(5) 构建响应
事务处理产生了响应主体, 就将内容放在响应报文中回送过去,响应报文中通常包括:
• 描述了响应主体 MIME 类型的 Content-Type 首部;
• 描述了响应主体长度的 Content-Length 首部;
• 实际报文的主体内容。
Web 服务器用 MIME 类型文件来设置资源输出的 Content-type 首部
重定向
重定向响应由返回码 3XX 说明。 Location 响应首部包含了内容的新地址或优选地址的 URI。 重定向可用于下列情况。
永久搬离的资源 | 资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的 URL |
临时搬离的资源 | 如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头去使用老的URL。 |
URL 增强 | 当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的 URL,并将用户重定向到这个新的URL 上去。 客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整的、经过状态增强的 URL。 |
负载均衡 | 如果一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。 |
服务器关联 | Web 服务器上可能会有某些用户的本地信息;服务器可以将客户端重定向到包含了那个客户端信息的服务器上去 |
规范目录名称 | 客户端请求的 URI 是一个不带尾部斜线的目录名时,大多数 Web 服务器都会将客户端重定向到一个加了斜线的 URI 上 |
(6)发送响应
Web 服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。
服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。
(7) 记录事务处理过程
当事务结束时,Web 服务器会在日志文件中添加一个条目,来描述已执行的事务。