作者简介

 
李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷。喜欢钻研底层技术,认为底层基础才是王道。一切新技术都离不开操作系统(CPU、内存、磁盘)、网络等。坚持输入输出,记录自己学习的点滴,在平凡中坚持前行,总有一天会遇见不一样的自己。公众号:运维汪(ID:Leeeee_Li)。
 
                                                                                        

一、问题

解释Web服务器是如何处理HTTP事务的
 

二、Web服务器

Web服务器会对HTTP请求进行处理并提供响应。Web服务器请求的七大步骤:
 
1)接受客户端连接
2)接收请求报文
3)处理请求
4)资源映射及访问
5)构建响应
6)发送响应
7)记录日志
 

1、接受客户端连接

 
1)处理新连接
客户端请求一条到Web服务器的TCP连接时,Web服务器会建立连接,判断连接的另一端是哪个客户端,从TCP连接中将IP地址解析出来。一旦新连接建立起来并接受,服务器就会将新连接添加到其现存Web服务器连接列表中,做好监视连接上数据传输的准备。Web服务器可以随意拒绝或立即关闭任意一条连接。有些Web服务器会因为客户端IP地址或主机名是未认证的,或者因为它是已知的恶意客户端而关闭连接。Web服务器也可以使用其他技术识别。
 
2)客户端主机名识别
可以用”反向DNS“对大部分Web服务器进行配置,以便将客户端IP地址转换成客户端主机名。Web服务器可以将客户端主机名用于详细的访问控制和日志记录。需要注意的是,主机名查找可能会花费很长的时间,这样会降低Web事务处理的速度。很多大容量的Web服务器会禁止主机名解析,或者只允许对特定内容进行解析。
 
可以用配置指令Hostnamelookups启用Apache的主机查找功能。如只打开HTML和CGI资源的主机名解析功能。
HostnameLookups off
<Files ~ "\.(html|htm|cgi)$">
HostnameLookups on
</Files>
3)通过ident确定客户端用户
 
服务器可以通过ident协议找到发起HTTP连接的用户名。这些信息对Web服务器的日志记录特别有用,流行的通用日志格式的第二个字段就包含了每条HTTP请求的ident用户名。

1)客户端打开一条HTTP连接
2)服务器打开自己到客户端ident服务113端口的连接
3)服务器发送一条简单的请求,询问与新连接相对应的用户名,把那个从客户端解析出包含用户名的响应
 
Apache的IdentityCheck on指令告知Apache Web服务器使用ident查找功能,如果没有ident信息可用,Apache会用连字符(-)来填充ident日志字段。如果没有ident信息可用,在使用通用日志格式的日志文件中,第二个字段通常都是连字符。
 

2、接收请求报文

当连接上有数据到达时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。
1)解析请求报文时,Web服务器的工作
 
1、解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号,各项之间有一个空格隔开,并以一个回车换行(CRLF)序列作为行的结束;
2、读取以CRLF结尾的报文首部;
3、检测到以CRLF结尾的、标识首部结束的空行;
4、读取请求主体
 
 
2)报文的内部表示法

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

高性能的Web服务器能够同时支持数千条连接,每个客户端都向服务器打开了一条或多条连接。不同的Web服务器会以不同的方式为请求服务。
 
单线程Web服务器:单线程的Web服务器一次只处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接。
多进程及多线程Web服务器:多进程和多线程Web服务器用多个进程,或更高效的线程同时对请求进行处理。
复用I/O的服务器:在复用结构中,要同时监视所有连接上的活动。当连接的状态发生变化时,就对那条连接进行处理,处理结束后,将连接返回到开放的连接列表中,等待下一次的状态变化。只有在有事情可以做时才会对连接进行处理,在空闲连接上等待的时候并不会绑定线程和进程。
复用的多线程Web服务器:将多线程和复用功能结合在一起,利用计算机的多个CPU。多个线程中(通常是一个物理处理器)的每一个都在观察打开的连接,并对每条连接(或打开连接中的一个子集)执行任务。

3、处理请求
 
当Web服务器接收到请求后,根据方法、资源、首部和可选的主体部分来对请求进行处理。
 
 
4、对资源的映射及访问
 
1)docroot(文档的根目录)
 
Web服务器的文件系统中有一个专门存放Web内容的目录,称为文档的根目录(document root,或docroot)。当一个Web服务器的根目录为/usr/local/httpd/files,并且有一条/special/s.gif的请求到达时,他的访问如图

在Apache中,对配置文件httpd.conf添加一行DocumentRoot行就可设置文档的根目录

DocumentRoot /usr/local/httpd/files
 
2)虚拟托管的docroot
 
虚拟托管的Web服务器会在同一台Web服务器上提供多个Web站点,每个站点在服务器上都有自己都有的文档根目录。虚拟托管Web服务器会根据URI或Host首部的IP或主机名来识别要使用的正确的文档根目录。通过这种方式,及时请求的URI相同,托管在同一Web服务器上的两个Web站点也可以拥有完全不同的内存。
 
A请求进来时,获取服务器的/doc/aaa/index.html
B请求进来时,获取服务器的/doc/bbb/index.html
 
在Apache可配置如下:
<VirtualHost www.aaa.com>
ServerName www.aaa.com
DocumentRoot /doc/aaa
TransferLog /logs/aaa.access_log
ErrorLog /1ogs/aaa.error_log
</VirtualHost> <VirtualHost www.bbb.com>
ServerName www.bbb.com
DocumentRoot /doc/bbb
TransferLog /logs/bbb.access_log
ErrorLog /1ogs/bbb.error_log
</VirtualHost>
3)用户的主目录docroot
 
Docroot提供私有的Web站点时,通常会以斜杠和波浪号(/~)开始,如
A请求进来时,获取服务器的/home/mary/index.html
B请求进来时,获取服务器的/home/ken/index.html
 
 
5、构建响应
 
一旦Web服务器识别出了资源、就执行请求方法中的描述的动作,并返回响应报文。响应报文中包含有状态码、响应首部、如果生成了响应主体的话,还包括响应主体。
 
1)响应主体
 
如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。如果有响应主体的话,响应报文中通常包括:
a)描述了响应主体MIME类型的Content-Type首部;
b)描述了响应主体长度的Content-Length首部;
c)实际报文的主题内容
 
2)MIME类型
 
Web服务器要负责确定响应主体的MIME类型。

a)根据扩展名确定MIME类型
Web服务器可以用文件的扩展名来说明MIME类型。Web服务器会为每个资源扫描一个包含了所有扩展名的MIME类型的文件,以确定MIME类型。Web服务器用MIME类型文件来设置资源输出的Content-type首部。
 
b)魔法分类
Apache Web服务器扫描每个资源的内容,并与一个已知模式表(魔法文件)进行匹配,决定每个文件的MIME类型。
 
c)显示分类
对Web服务器进行配置,使其不考虑文件的扩展名和内容,强制特定文件或目录内容拥有某个MIME类型。
 
d)类型协商
通过配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式以及相关的MIME类型。
 
3)重定向
Web服务器有时会返回重定向响应而不是成功的报文。Web服务器可以将浏览器重定向到其他地方来执行请求。重定向响应码为3XX系列。Location响应首部包含了内容的新地址或优选地址的URL。
 
a)永久删除的资源
资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的URL。Web服务器可以告诉客户端资源已经被重新命名了,这样客户端就可以在从新地址获取资源之前,更新书签之类的信息了。状态码301 Moved Permanently用于此类重定向。
 
b)临时删除的资源
资源被临时移走了或重命名了。服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头使用老的URL,不要对书签进行更新。状态吗303 See Other以及状态码307 Temporary Redirect用于此类重定向。
 
c)URL增强
服务器通常用重定向来重写URL,往往用于嵌入上下文。当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的URL,并将用户重定向到这个新的URL上。客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整的、经过状态增强的URL。状态吗303 See Other以及状态码307 Temporary Redirect用于此类重定向。

d)负载均衡
一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。状态吗303 See Other以及状态码307 Temporary Redirect用于此类重定向。

e)服务器关联
Web服务器上可能会有某些用户的本地信息,服务器可以将客户端重定向到包含了那个客户端信息的服务器上去。状态吗303 See Other以及状态码307 Temporary Redirect用于此类重定向。

f)规范目录名称
客户端请求的URL是一个不带尾部斜线的目录名时,大多数Web服务器都会将客户端重定向到一个加了斜线的URL上,这样相对链接就可以正常工作了。
 
 
6、发送响应
 
Web服务器通过连接发送数据,发送数据与接收数据一样可能有多条到客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还需要特别注意持久连接的处理。对于非持久连接,服务器应该在发送了整条报文之后,关闭自己这一端的连接。
 
7、记录日志
 
当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务。
 

三、学习交流

欢迎大家关注我的公众号,一起交流、学习。

图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应的更多相关文章

  1. 和我一起学《HTTP权威指南》——Web服务器

    Web服务器 Web服务器会做些什么 1.建立连接(接受或关闭一个客户端连接) 2.接收请求(读取HTTP报文) 3.处理请求(解释请求报文并采取行动) 4.访问资源 5.构建响应(创建带有正确首部的 ...

  2. 图解HTTP权威指南(四)| 代理

    作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...

  3. asp.net 开发问题:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值。

    "Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值." 这个问题在开发需要上传文件的时候可能会遇到,今天遇到这个问题,百度过也有挺多的修改方法. 方法1: 修 ...

  4. asp.net 问题:Web 服务器上的请求筛选模块被配置为 拒绝包含的查询字符串过长的请求

    发现问题: post请求,在发送一个图片base64编码的字符串时,服务端报这个错误. 报错信息中给出了解决办法: 最可能的原因: Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长. ...

  5. Ext.ux.UploadDialog上传大文件 HTTP 错误 413.1 - Request Entity Too Large Web 服务器拒绝为请求提供服务,因为该请求实体过大。Web 服务器无法为请求提供服务,因为它正尝试与客户证书进行协商,但请求实体过大。

    问题描述 问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 原因:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(I ...

  6. 图解HTTP权威指南 | HTTP报文

                                                                                    一.问题 1.报文流是如何流动的 2.H ...

  7. 图解HTTP权威指南(五) | HTTP缓存

    作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...

  8. 《HTTP权威指南》5-Web服务器

    各种形状,风格,尺寸的Web服务器 Web服务器会对HTTP请求进行处理并提供响应.Web服务器有着不同的风格,形状和尺寸但是不管功能,外貌,风格有何差异,所有的Web服务器都能够接收请求资源的HTT ...

  9. 图解HTTP权威指南(二)| 连接管理

    一.两个问题 1.HTTP是如何使用TCP连接的 2.HTTP的连接,并行连接.keep-alive(持久连接)和管道化连接   二.TCP连接 1.什么是TCP   TCP/IP是全球计算机及网络设 ...

随机推荐

  1. 五. Webpack详解

    1. 什么是Webpack 1.1 引入 什么是webpack?这个webpack还真不是一两句话可以说清楚的. 我们先看看官方的解释:At its core, webpack is a static ...

  2. JVM 堆中对象分配、布局和访问

    本文摘自深入理解 Java 虚拟机第三版 对象的创建 Java 是一门面向对象的语言,Java 程序运行过程中无时无刻都有对象被创建出来.从语言层面看,创建对象只是一个 new 关键字而已,而在虚拟机 ...

  3. 学JAVA的艰难之路

    周五回家了,这两天也没有更新代码系列,很抱歉,之后会补上.今天刚到宿舍,写了会代码,想用一个数组的从键盘输入,再也弄不好了,最终在我不断的翻之前写的代码,终于是找到了一个例子,真的不容易,编程这东西, ...

  4. moviepy音视频剪辑:headblur函数遇到的ValueError assignment destination is read-only问题及解决办法

    ☞ ░ 前往老猿Python博文目录 ░ 一.运行环境 运行环境如下: python版本:3.7 opencv-python版本:4.2.0.34 numpy版本:1.19.0 二.错误案例代码及报错 ...

  5. PyQt(Python+Qt)学习随笔:QAbstractItemView的editTriggers属性以及平台编辑键(platform edit key )

    老猿Python博文目录 老猿Python博客地址 editTriggers属性 editTriggers属性用于确认哪些用户操作行为会触发ItemView中的数据项进入编辑模式. 此属性是由枚举类E ...

  6. CTF写脚本

    今天总结一下CTF如何写脚本快速得分....(比较菜,能力有限,大佬勿喷) 所谓的写脚本得分,就是利用了 python爬虫的思想,如果之前没有听说过的话,可以去爬虫的相关语法.如果是看网上的视频的话, ...

  7. mysql 创建新用户、数据库、授权

    创建用户 1.登录mysql mysql -uroot -p 2.创建本地用户(2.3选其一) #use mysql;             //选择mysql数据库 #create user 'w ...

  8. Dr.COM获取用户属性超时!请检查防火墙配置允许UDP 61440端口。怎么解决

    最近校园网老是出问题,看到好多同学都遇到了下面的问题,我就来说一下我的解决方法.(目前我认识的有三个同学遇到了这样的情况,用这个方法都解决了,但不一定对每个人都有效) 首先登陆net.scut.edu ...

  9. 百度前端技术学院-基础-day2

    2020.9.15 今天是学习前端基础技术的第二天,今天制作了一个在线简历,纯html的那种.帮助我复习了以前的基础知识,也增加了新的知识点,比如制作列表可以用fieldset来整合数据. 我的在线简 ...

  10. 哪些地方会出现css阻塞,哪些地方会出现js阻塞?

    js的阻塞特性: 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等. 直到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 为了提高用户体验,新一代浏 ...