- 作者: 雪山肥鱼
- 时间:20211204 09:12
- 目的: Web 服务器
1. Web服务器简介:
逻辑上实现了http协议、管理web资源、负责提供web服务器的管理功能。
Web服务器逻辑和操作系统共同管理TCP连接。
- 底层操作系统负责管理底层计算机系统的硬件细节。
- 提供TCP/IP网络支持、负责装载web资源的文件系统以及控制当前计算活动的进程管理功能
Apache 就是 开源的 软件web 服务器的一种。
2. 实际的Web服务器会做些什么
Web服务器请求步骤.png- 建立连接: Server接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭
- 接收请求: 从网络中读取一条HTTP请求报文。
- 处理请求: 对请求报文进行解释,并采取行动
- 访问资源:访问报文中指定的资源
- 构建响应:创建带有正确首部的HTTP响应报文
- 发送响应: 将响应回送给客户端
- 记录事务处理过程: 记录日志
3 处理新连接
一旦连接建立起来并被接受,服务器会将新连接添加到其现存的web服务器连接列表中,做好监视连接上数据传输的设备。
3.1 客户端主机名识别
可以用反向DNS对大部分web服务器进行配置,以便将客户端IP地址转换成 客户端 主机名。
好处: web服务器可以将客户端主机名用于详细的访问控制和日志记录。
坏处:主机名查找可能会花费很长时间,要么只允许特定内容进行解析。
3.2 通过ident确定客户端用户
有些web服务器还支持ident 协议。服务器可以通过ident协议找到发起http连接的用户名。对记录日志非常有用。
127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
类似这种。
如果客户端支持ident协议,就在tcp端口113上监听 ident请求。
a) 客户端打开了一条http连接
b) 服务器打开自己到客户端ident服务器端口(113)的连接。
c)由服务器作为client(C),向客户端的113(S)发起 ident request
d)客户端返回ident响应, 接触客户端resp中的用户名响应
但ident在公共因特网上不能很好的使用
- 很多客户端的PC,没有运行ident识别协议的 守护进程软件
- ident 协议 会使http事务处理产生严重时延
- 防火墙不允许ident流量进入
- ident不安全,容易伪造
- ident 不支持虚拟ip地址
- 暴露客户端用户名,涉及隐私问题
4 接受请求报文
- 解析请求
- 解析请求行,找指定方法,指定的URI 及 版本号,各项由空格分隔,以回车换行(CRLF)序列作为行的结束。
- 解析首部, 以CRLF结尾
- 读取 请求主体
解析请求报文时,web服务器会不定期从网络上接受输入数据。网络连接可能随时都会出现延迟。web服务器从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止。
4.1 报文内部表示方法
web服务器对报文解析后,并用自己内部的数据结构来存储请求报文。
image.png
4.2 连接的输入与输出处理结构
请求可能会在任意时刻到达,所以web服务器不停观察有无新的web请求。不同的web服务器会以不同的方式为请求服务。
单线程web服务器.png单线程的服务器一次只处理一个请求。一个事务处理结束后,才会去处理下一条连接。
结构容易实现,单性能很差。
多进程和多线程服务器用多个进程或更高效的现成同时对请求进行处理。
可以根据需要创建,或者预先创建一些线程/进程。有些服务器会为每条连接分配一个线程/进程,但当服务器同时要处理成百上千甚至上万的连接时,需要的继承或者线程数量可能会消耗太多内存或系统资源。(预先分配 线程池,进程池,内存池等手段)
因此这类服务器会对线程/进程的最大数量进行限制
为了支持大量的连接,很多web 服务器都采用了复用结构。复用结构中,同时监视所有连接上的活动。当连接的状态发生变化(数据可用或出现错误),就对那条连接进行处理。
处理结束后,将连接返回到开放连接列表中。等待下次变化。
只有在有事情可做时,才会对连接进行处理,在空闲连接上等待的时候并不会绑定线程和进程
也就是有反应,再开线程/进程 处理谁 多线程I/O复用.png
线程与复用功能结合,利用计算机平台上多个CPU。多个线程中的每一个都在观察打开的连接。并对每条连接执行少量任务。
5. 处理请求
收到并解析请求后,可以根据方法、资源、首部和可选的主体部分对请求进行业务处理。
6. 对资源的映射及访问
在web服务器将内容传送给客户端之前,要将请求 报文中的URI映射为web服务器上适当的内容或内容生成器,以识别出内容的源头。
6.1 docroot
请求URI 作为名字 来 访问 Web 服务器文件系统中的文件。通常web 服务器的文件系统中会有一个特殊的文件夹专门用于存放web内容。
即文档的根目录。
请求将uri映射为本地Web服务器上的资源。
同时服务器也需要注意,不能让URL退到docroot之外,将文件系统的其余部分暴露出来。不允许这样的uri出现:
http://www.xxx.com/../
-
虚拟托管的docroot
会在同一台web服务器上,提供多个web站点。每个站点拥有自己的文档根目录
image.png
7 目录列表
web服务器可以接受收对目录url的请求,其路径可以解析为一个目录。而不是文件。我们可以对大多数web服务器进行配置。使其在客户端请求目录url时 采取不同的动作。
- 返回一个错误
- 不返回目录,返回一个特殊的默认“索引文件/”
- 扫描目录,返回一个包含目录内容的html页面
大多数web服务器都会去查找目录中的一个名为index.html 的文件来替代此目录。
如果用户请求的时一个目录的url,并且这个目录中有一个名为index.html 的文件。服务器就会返回这个文件。
7.1 动态内容资源映射
Web 服务器还可以将URI映射为动态资源,也就是说,映射到按需动态生成内容的程序上去。
静态与动态资源.png
实际上,有一大类名为应用程序服务器的Web 服务器会将Web服务器连接到复杂的后端应用上去。
Web 服务器主要做的事:
- 要能分辨出资源什么时候是动态的
- 动态内容生成程序位于何处
- 如何运行动态程序
也就是说 web服务器会将URI路径名 映射为 可执行文件目录。
7.2 服务器端包含项
服务器端包含项(SSI),如果某个资源被表示为存在服务器端包含想,服务器会在将其发送给客户端之前对资源内容进行处理。
7.3 访问控制
web 服务器还可以为特定资源进行访问控制,有请求到达,要访问受控制资源时,服务器可以根据客户的ip地址进行访问控制,比如输入密码才能访问。
8 构建响应
8.1 响应实体
如果事务处理产生了响应 主体,就将内容放在响应报文中发回去。实体包括:
- 描述了响应主体MIME类型的 content-type 首部
- 描述了响应主体长度 contet-length
- 实际报文的主体内容
8.2 MIME 类型
服务器要负责确定响应主体的MIME类型。有很多配置服务器的方法可以将MIME类型与资源关联起来。
image.png
8.3 重定向
Web 服务器有时会返回重定向响应而不是成功的报文。Web服务器可以将浏览器重定向到其他地方执行请求。
重定向返回码 3XX。Location响应首部包含了内容的新地址。
- 永久删除的资源
资源可能被删除或者转移到了新的位置,亦或是改了名字。
状态码 301 Moved Permanently - 临时删除的资源
被临时移走,后者重命名了。服务器希望C 重新去定位。但由于重命名时临时的,所以服务器希望客户端将来还可以回头去使用老的URL,不要对书签进行更新。状态码303 See Other 以及 状态码 307 Temporary Redirect 用于此类重定向 - URL 增强
S端通常用重定向重写URL,客户端跟着新的URL,重新发起请求。状态码为 303 307 - 负载均衡
服务器负载太中,希望定位到新的服务器上,303 307 - 服务器关联
其他服务器有某些用户本地信息。服务器可以将客户端重定向到包含那个客户端信息的服务器上。
9. 发送响应
对于非持久连接而言,服务器应该发送了整条报文后,关闭自己一端。
对于持久而言,连接仍然可以保持打开状态。这种情况下服务器端要正确的计算content length,不然客户端无法知道响应何时结束。
10. 记录日志
当事务结束时,web服务器会在日志文件中添加一跳目录,来描述已执行的事务。
网友评论