HTTP 笔记 WEB服务器

web服务器 可以用来表示web服务器的软件,也可以用来表示提供web页面的特定设备或计算机

Web服务器都能够接收请求资源的http请求,将内容回送给客户端。

 Web服务器实现了HTTP和相关的TCP连接处理。负责管理Web服务器提供的资源,以及对web服务器的配置、控制及扩展方面的管理 

Web服务器逻辑实现了HTTP协议、管理着web资源,并负责提供web服务器的管理功能。web服务器逻辑和操作系统共同负责管理TCP连接。底层操作系统负责管理底层计算机系统的硬件细节,并提供了TCP/IP网络支持、负责装载web资源的文件系统以及控制当前计算活动的进程管理功能。

 1 通用软件web服务器

通用软件web服务器都运行在标准的、有网络功能的计算机系统上。可以选择开源软件或者商业软件。基本上所有的计算机和操作系统中都有可用的web服务器软件。

免费的apache软件占据了所有因特网web服务器中大约60%的市场

微软的web服务器占据了另外30%

sun的iPlanct占据了另外3%

2 web服务器设备

web服务器设备 是预先打包好的软硬件解决方案。厂商会在他们选择的计算机平台上预先安装好软件服务器,并将软件配置好。但是web服务器通常不太灵活,特性不太丰富,而且服务器硬件也不太容易重用或升级

3 嵌入式web服务器

是要嵌入到消费类产品中去的小型web服务器。嵌入式web服务器允许用户通过便捷的web浏览器接口来管理其消费者设备。

实际的web服务器会做些什么

1 建立连接--接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将期关闭。

2 接收请求--从网络中读取一条HTTP请求报文

3 处理请求--对请求报文进行解释,并采取行动。

4 访问资源--访问报文中指定的资源。

5 构建响应--创建带有正确首部的HTTP响应报文

6 发送响应--将响应回送给客户端

7 记录事务处理过程--将与已完成事务有关的内容记录在一个日志文件中

接受客户端连接

如果客户端已经打开了一条到服务器的持久连接,可以使用那条老婆入宫发送它的请求。否则,客户端需要打开一条新的服务器的连接。

1 处理新连接

  客户端请求一条到web服务器的TCP连接时,web服务器会建立连接,判断连接 另一端是哪个客户端,从TCP连接中将IP地址解析出来。一旦新连接建立起来并被接受,服务器就会将新连接添加到其现在web服务器连接列表中,做好监视连接上数据传输的准备。

  web服务器可以随意拒绝或立即关闭任意一条连接。

2 客户端主机名识别

  可以用 反向DNS 对大部分web服务器进行配置,以便将客户端IP地址转换成客户端主机名。web服务器可以将客户端主机名用于详细的访问控制和日志记录。但要注意的是,主机名查找可能会花费很长时间,这样会降低web事务处理的速度。很多大容量web服务器要么会禁止主机名解析,要么只允许对特定内容进行解析。

如果客户端支持ident协议,就在TCP端口113上监听ident请求。客户端打开一条http连接,服务器打开自己到客户端iden服务器端口 连接,发送一条简单的请求,询问与由客户端和服务器端口号指定的 新连接相对应的用户名,并从客户端解析出包含用户名的响应。

很多客户端PC没有运行ident识别协议守护进程软件

ident协议会使http事务处理产生严重的时延

很多防火墙不允许ident流量进入

ident协议不安全,容易被伪造

ident协议也不支持虚拟IP地址

暴露客户端的用户还涉及隐私问题

接收请求报文

连接上有数据到达时,web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来

解析请求报文时,web服务器会:

1 解析请求行,查找请求方法、指定的资源标识符URI 以及版本号,各项之间由一个空格分隔,并以一个回车换行CRLF 序列作为行的结束。

2 读取以CRLF结尾的报文首部

3 检测到CRLF结尾的、标识首部结束的空行

4 如果有的话 长度由content-length首指定,读取请求主体。

解析请求报文时,web服务器会不定期地从网络上接收输入数据。网络连接可能随时都会出现延迟。web服务器需要从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止。

有些web服务器还会用便于进行报文操作的内部数据结构来存储请求报文。

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

  高性能的web服务器能够同时支持数千条连接。这些连接使得服务器可以与世界各地的客户端进行通信,每个客户端都向服务器打开了一条或多条连接。某些连接可能在快速地向web服务器发送请求,而其他一些连接则可能在慢慢发送,或者不经常发送请求,还有一些可能是空闲的,安静地等待着将来可能出现的动作。

因为请求可能会在任意时刻到达,所以web服务器会不停地观察有无新的web请求。不同的web服务器结构会以不同的方式为请求服务。

单线程web服务器:一次只处理一个请求,直到期完成为止。一个事务处理结束之后,才去处理下一条连接。这种结构易于实现,但在处理过程中,所有其他连接都会被忽略。这样会造成严重的性能问题,只适用于低负荷的服务器,以及诊断工具。

多进程及多线程web服务器:用多个进程,或更高效的线程同时对请求进行处理。可以根据需要创建,或者预先创建一些线程、进程。有些服务器会为每条连接分配一个线程、进程,但当服务器同时要处理成百、上千,甚至数以万计的连接时,需要的进程或线程数量可能会消耗太多的内存或系统资源。因此,很多多线程web服务器都会对线程、进程的最大数量进行限制。

复用I/O的服务器:为了支持大量的连接,很多web服务器都采用了复用结构。在复用结构中,要同时监视所有连接上 活动。当连接的状态发生变化时,比如 有数据可用,或出现错误时,就对那条连接进行少量的处理,处理结束之后,将连接返回到开放连接列表中,等待下一次状态变化。只有在有事情可做时才会对连接进行处理,在空闲连接上等待的时候并不会绑定线程和进程。

复用的多线程web服务器:有些系统会将多线程和复用功能结合在一起,以利用计算榿 台上的多个CPU。多个线程(通常是一个物理处理器)中的每一个都在观察打开的连接 或打开的连接中 一个子集,并对每条连接执行少量的任务。

处理请求

一旦web服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对对请求进行处理了。

有些方法 如post 要求请求报文中必须带有实体主体部分的数据。其他一些方法 如options允许有请求的主体部分,也允许没有。少数方法 如 GEt 禁止在请求报文中包含实体的主体数据。

对资源的映射及访问

web服务器是资源服务器,它们负责发送预先创建好的内容,比如html页面或jpeg图片,以及运行在服务器上的资源生成程序所产生的动态内容。

在web服务器将内容传送给客户端之前,要将请求报文中的URI映射为web服务器上适当的内容或内容生成器,以识别出内容的源头。

1 docroot  

web服务器支持各种不同类型的资源映射,但最简单的资源映射形式就是用请求URI作为名字来访问web服务器文件系统中的文件。通常,web服务器的文件系统中会有一个特殊的文件夹专门用于存放web内容。这个文件夹被称为文档的根目录 document root 或 docroot 。web服务器从请求报文中获取URI,并将其附加在文档根目录的后面。

虚拟托管的docroot

虚拟托管的web服务器会在同一台web服务器上提供多个web站点,每个站点在服务器上都有自己独有的文档根目录。虚拟托管web服务器会根据URI或Host首部的IP地址或主机名来识别要使用的正确文档根目录。通过这种方式,即使请求uri 完全相同,托管在同一web服务器上的两个web站点也可以拥有完全不同的内容了。

用户的主目录docroot

docroot的另一种常见应用是在web服务器上为人们提供私有的web站点。通常会把那些以斜杠和波浪号 /~开始,后面跟着用户名的URI映射为此用户的私有文档根目录。私有docroot通常都是用户主目录下那个名为public_html的目录,但也可将其配置为其他值。

目录列表

web服务器可以接收对目录URL的请求,其路径可以解析为一个目录,而不是文件。可以对大多数web服务器进行配置,使其在客户端请求目录url时采取不同的动作。

1 返回一个错误

2 不返回目录,返回一个特殊的默认“索引文件".

3 扫描目录,返回一个包含目录内容的html页面

大多数web服务器都会去查找目录中一个名为index.html 或 index.htm的文件来代表此目录。如果用户请求的是一个目录的URL ,而且这个目录中有一个名为index.html 或 index.htm 的文件,服务器就会返回那个文件的内容。

如果用户请求目录URI时,没有提供默认的索引文件,而且没有禁止使用目录索引,很多web服务器都会自动返回一个HTML文件,此文件中会列出那个目录里的文件名,以及每个文件的大小和修改日期,还包括到每个文件的URI链接。使用这个文件列表可能会很方便,但有些好事都也可以通过它在web服务器上找到一些通常找不到的东西。

动态内容资源的映射

web服务器还可以将uri映射为动态资源,映射到按需动态生成内容的程序上去。

CGI是早期出现的一种简单、流行的服务端应用程序执行接口

服务器商包含项:很多web服务器提供了对服务器端包含项SSI的支持。如果某个资源被标识为存在服务器商包含项,服务器就会在将其发送给客户端之前对资源内容进行处理。要对内容进行扫描,以查找特定的模板,这些模板可以是变量名、也可以是嵌入式脚本。可以用变量的值或可执行脚本的输出来取代特定的模板。这是创建动态内容的一种简便方式。

访问控制:web服务器可以为特定资源进行访问控制。有请求到达,要访问受控资源时,web服务器可以根据客户端的IP地址进行访问控制,也可以要求输入密码来访问资源。

构建响应

一旦web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。

响应实体:

如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。如果有响应主体的话,响应报文中通常包括:

1 描述了响应主体MIME类型的Content-Type首部

2 描述了响应主体长度的Content-Length首部

3 实际报文的主体内容

MIME类型:

Web服务器要负责确定响应主体的MIME类型。有很多配置服务器的方法可以将MIME类型与资源关联起来

1 MIME类型mime.types

web服务器可以用文件的扩展名来说明MIME类型。web服务器会为每个资源扫描一个包含了所有扩展名的MIME类型的文件,以确定其MIME类型。

2 魔法分类 Magic typing

Apache Web服务器可以扫描每个资源的内容,并将其与一个已知模式表被称为魔法文件 进行匹配,以决定每个文件的MIME类型

3 显式分类 Explicit typing

可以对web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型。

4 类型协商

有些web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置web服务器,使其可以通过与用户的协商来决定使用哪种格式最好。

重定向

web服务器可以将浏览器重定向到其他地方来执行请求。返回码3XX,Location响应首部包含了内容的新地址或优选的地址的URI。

1 永久删除 的资源:资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的URL。web服务器可以告诉客户端资源已经被重命名了。这样客户端就可以在从新地址获取资源之前,更新书签之类的信息。状态码301moved permanently用于此类重定向

2 临时删除 的资源:如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头去使用老的URL。状态码:303see other 307 temporary redirect 用于此类重定向

3 URL增强:当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的URL,并将用户重定向到这个新的URL上去。客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整 、经过状态增强的URL。303 307 用于此类重定向

4 负载均衡:如果一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。303 307

5 服务器关联:web服务器上可能会有某些用户的本地信息,服务器可以将客户端重定向到包含了那个客户端信息的服务器上去。303 307

6 规范目录名称:客户端请求的URI是一个不带尾部斜线的目录名时,大多数web服务器都会将客户端重这向到一个加了斜线的uRL上

发送响应

服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端 的连接。

对持久连接,连接可能仍保持打开状态,在这种情况下,服务器要特别小心,要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束了。

记录日志

当事务结束时,web服务器会在日志文件中添加一个条目。来描述已执行的事务。大多数web服务器都提供了几种日志配置格式。

原文地址:https://www.cnblogs.com/caojuansh/p/12988887.html