关于作者李先生(Lemon),高级运维工程师(自称),SRE专家(target),35岁梦想买辆保时捷。喜欢钻研底层技术,认为底层基础才是王道。所有新技术都离不开操作系统(CPU、内存、磁盘)、网络等,坚持输入输出,记录自己的学习,在平凡中不断前行,总有一天会遇到不一样的自己。公众号:王运维(ID:Leeeee_Li)。web服务器请求的七步:1)接受客户端连接2)接收请求消息3)处理请求4)资源映射和访问5)构建响应6)发送响应7)记录日志1、接受客户端连接1)当一个新的connection客户端向Web服务器请求一个TCP连接,Web服务器会建立一个连接,判断连接的另一端是哪个客户端,并从TCP连接中解析出IP地址。一旦建立并接受了新连接,服务器就会将新连接添加到其现有Web服务器连接列表中,以准备监视连接上的数据传输。Web服务器可以自由拒绝或立即关闭任何连接。某些Web服务器会关闭连接,因为客户端IP地址或主机名未通过身份验证,或者因为它是已知的恶意客户端。Web服务器也可以使用其他技术来识别。2)客户端主机名识别大多数网络服务器都可以配置“反向DNS”,将客户端IP地址转换为客户端主机名。Web服务器可以使用客户端主机名进行详细的访问控制和日志记录。需要注意的是,主机名查找可能需要很长时间,这会减慢Web事务处理的速度。许多大容量Web服务器禁止主机名解析,或者只允许解析特定内容。可以使用配置指令Hostnamelookups启用Apache的主机查找功能。比如只开启HTML和CGI资源的主机名解析功能。HostnameLookupsoffHostnameLookupson3)通过ident确定客户端用户服务器可以通过ident协议找到发起HTTP连接的用户名。此信息对于Web服务器日志记录特别有用,流行的通用日志格式的第二个字段包含每个HTTP请求的用户名。1)客户端打开一个HTTP连接2)服务器在端口113上打开它自己的到客户端身份服务的连接3)服务器发送一个简单的请求,询问与新连接对应的用户名,并解析来自客户端的包含用户Apache的IdentityCheckon指令告诉ApacheWeb服务器使用身份查找功能,如果没有可用的身份信息,Apache将用连字符(-)填充身份日志字段。如果没有可用的身份信息,则第二个字段通常是使用通用日志格式的日志文件中的所有连字符。2.接收请求报文当连接上有数据到达时,Web服务器会从网络连接中读取数据,并解析出请求报文中的内容。1)在解析请求报文时,Web服务器的工作1.解析请求行,找到请求方法、指定的资源标识符(URI)和版本号。每一项之间有一个空格,并以回车换行(CRLF)序列作为行尾;2、读取以CRLF结尾的报文头;3、检测以CRLF结尾的空行,标记header结束;4、读取请求体2)消息的内部表示方法3、连接输入/输出处理结构一个高性能的web服务器可以同时支持数千个连接,每个客户端向服务器打开一个或多个连接。不同的Web服务器将以不同的方式处理请求。单线程Web服务器:单线程Web服务器一次处理一个请求,直到它完成。事务完成后,处理下一个连接。多进程和多线程Web服务器:多进程和多线程Web服务器使用多个进程或更高效的线程来同时处理请求。多路复用I/O服务器:在多路复用结构中,同时监视所有连接上的活动。当连接的状态改变时,连接被处理。处理完成后,连接返回到打开的连接列表中,等待下一次状态变化。只有在有事可做时才处理连接,线程和进程在等待空闲连接时不受约束。Multiplexed多线程Web服务器:结合了多线程和多路复用功能,以利用计算机的多个CPU。多个线程(通常是物理处理器)中的每一个都观察打开的连接并在每个连接(或打开的连接的子集)上执行任务。3.处理请求Web服务器收到请求后,根据方法、资源、标头和可选的正文部分对请求进行处理。4、资源的映射与访问1)docroot(文档根目录)在Web服务器的文件系统中,有一个专门存放Web内容的目录,称为文档根目录(documentroot,或docroot)。当一个web服务器的根目录是/usr/local/httpd/files,一个/special/s.gif的请求到达时,它的访问如Apache中所示,在配置文件httpd.conf中添加一行DocumentRoot可以设置文件根目录DocumentRoot/usr/local/httpd/files2)虚拟托管docroot虚拟托管Web服务器会在同一个Web服务器上提供多个网站,每个网站在服务器上都有自己的。文档根目录。虚拟主机Web服务器将根据URI或主机标头中的IP或主机名来识别要使用的正确文档根目录。这样即使请求的URI相同,托管在同一台Web服务器上的两个网站也可以有完全不同的记忆。当一个请求进来时,获取服务器的/doc/aaa/index.html当B请求进来时,获取服务器的/doc/bbb/index.html以波浪号(/~)开头。比如当一个请求进来时,获取服务器的/home/mary/index.html,当B请求进来时,获取服务器的/home/ken/index.html。Apache配置如下:aaa.com>ServerNamewww.aaa.comDocumentRoot/doc/aaaTransferLog/logs/aaa.access_logErrorLog/logs/aaa.error_logServerNamewww.bbb.comDocumentRoot/doc/bbbTransferLog/logs/bbb.access_logErrorLog/logs/bbb.error_log5.构建响应Web服务器识别资源后,将执行请求方法中描述的操作,返回响应消息。响应消息包含状态代码、响应标头和响应正文(如果已生成)。1)响应体如果事务处理产生了响应体,将内容放在响应报文中发回。如果有响应体,响应消息通常包括:a)Content-Type头,描述响应体的MIME类型;b)描述响应主体长度的Content-Length头;c)实际消息的主题内容2)MIME类型Web服务器有责任确定响应正文的MIME类型。a)根据扩展名判断MIME类型Web服务器可以使用文件的扩展名来描述MIME类型。对于每个资源,Web服务器扫描一个包含MIME类型的所有扩展名的文件以确定MIME类型。Web服务器使用MIME类型文件来设置资源输出的Content-type标头。b)魔法分类Apache网络服务器扫描每个资源的内容并将其与已知模式(魔法文件)表进行匹配以确定每个文件的MIME类型。c)显示分类配置Web服务器强制某些文件或目录内容具有特定的MIME类型,而不管文件扩展名和内容。d)类型协商通过配置Web服务器,它可以通过与用户协商来决定使用哪种格式以及相关的MIME类型。3)重定向Web服务器有时会返回重定向响应而不是成功消息。Web服务器可以将浏览器重定向到别处以执行请求。重定向响应代码是3XX系列。Location响应标头包含内容的新位置或首选位置的URL。a)永久删除的资源资源可能已被移动到新位置,或使用新URL重命名。Web服务器可以告诉客户端资源已重命名,以便客户端可以在从新地址获取资源之前更新书签等信息。状态代码301MovedPermanently用于此类重定向。b)Temporarilydeletedresources资源被临时移动或重命名。服务器可能希望将客户端重定向到新位置。但是因为重命名是暂时的,服务器希望客户端以后可以回到旧的URL而不更新书签。状态303SeeOther和状态代码307TemporaryRedirect用于此类重定向。c)URL增强服务器通常使用重定向重写URL,通常用于嵌入上下文。当请求到达时,服务器生成一个带有嵌入状态信息的新URL,并将用户重定向到这个新URL。客户端遵循此重定向并重新发出请求,但这次使用完整的、状态增强的URL。状态303SeeOther和状态代码307TemporaryRedirect用于此类重定向。d)负载平衡当超载的服务器收到请求时,服务器可以将客户端重定向到负载较轻的服务器。状态303SeeOther和状态代码307TemporaryRedirect用于此类重定向。e)服务器关联Web服务器上可能有一些用户的本地信息,服务器可以将客户端重定向到包含该客户端信息的服务器。状态303SeeOther和状态代码307TemporaryRedirect用于此类重定向。f)Canonicaldirectoryname当客户端请求的URL是一个没有尾部斜杠的目录名时,大多数Web服务器会将客户端重定向到一个带有斜杠的URL,这样相关链接就可以正常工作了。6.发送响应Web服务器通过连接发送数据。可能有多个到客户端的连接,用于发送数据和接收数据。有些是空闲的,有些正在向服务器发送数据,有些正在向客户端发送响应数据。为了记录连接的状态,服务器还需要特别注意对长连接的处理。对于非持久连接,服务器应在发送完整个消息后关闭自己端的连接。7.日志当一个事务结束时,Web服务器会在日志文件中添加一个条目来描述已经执行的事务。