web服务器
web服务器实现了http和相关的tcp连接处理,负责管理web服务器提供的资源,以及对服务器的配置,控制以及拓展等方面的管理
web服务器逻辑实现了http协议,并负责提供web服务器的管理功能,web服务器逻辑和操作系统共同负责了tcp连接,底层操作系统负责管理底层计算机系统的硬件细节,提供了tcp/ip的网络支持,负责装在web资源的文件系统以及控制当前计算活动的进程管理系统。
实际的web服务器的步骤
- 建立连接-接受一个客户端连接,或者如果不希望和这个客户端建立连接,就将其关闭
- 接收处理-从网络中读取一条HTTP请求报文
- 处理请求-对请求报文进行解释,并采取行动
- 访问资源-访问报文中指定的资源
- 构建响应-创建带有正确首部的http响应报文
- 发送响应-将响应发送给客户端
- 记录事务处理过程-将已经完成事务的内容记录在一个日志文件中
接受客户端连接
如果客户端已经打开了一条服务器的持久连接,可以使用连接来发送他的请求。否则客户端需要打开一条新的服务器连接
处理新的连接
客户端请求一条到web服务器的tcp连接的时候,web服务器会建立起来,判断另一端是哪个客户端,从tcp连接中将ip地址解析出来,一旦建立新的连接并被接受,服务器就会将新的连接添加到现存的web服务器列表中,做好监视连接上数据的准备。
web服务器可以随意的拒绝或者立即关闭任意一条连接,有些web服务器会因为客户端的ip地址或者主机名是未认证的,或者是已知的恶意客户端而关闭连接。web服务器可以使用其他的识别技术。
客户端主机名识别
可以使用反向dns对大部分web服务器进行配置,以便将客户端ip地址从转换为客户端主机名,web服务器可以将客户端主机名用于详细的访问控制和日志记录。
主机名查找会花费大多时间,这样会降低web事务处理的速度,很多大容量web服务器会禁止主机解析,只允许对特定的内容进行解析。
通过ident确定客户端用户
有些web服务器还支持IETF的ident协议,可以通过这个协议找到http连接的用户名,这些信息对web服务器的日志记录很有用。
如果客户端支持ident协议,就在tcp端口113上监听ident请求,客户端打开了一条http连接,然后服务器打开自己到客户端ident服务器端口113的连接,发送一条简单的请求,询问与新连接对应的用户名,并从客户端解析出包含用户名的响应。
ident在组织内部可以很好的工作,但是在互联网上不能很好的运作。
- 很多客户端pc没有运行ident识别协议守护进程软件
- ident协议会使HTTP事务处理产生严重的时延
- 很多防火墙不允许ident流量接入
- ident协议不安全,容易被伪造
- ident协议不支持虚拟ip地址
- 暴露客户端的用户名还涉及到隐私的问题
接受请求报文
连接上有数据到达的时候,web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。
解析请求报文的时候,web服务器会
- 解析请求行,查找请求方法,指定的资源标识符以及版本号,各项之间有一个空格分割,并且以一个回车符作为行的结束。
- 读取crlf结尾的报文首部
- 检测到crlf结尾的,标识首部结束的空行
- 如果有的化,长度由content-length首部指定,读取请求主体
报文的内部表示法
有些web服务器还会便于进行报文操作的内部数据结构来存储请求报文,数据结构中可能包含有指向请求报文中各个片段指针及其长度,这样就可以将这些首部放到一个快速查询表中,以变快速的访问特定首部的具体值了
连接的输入/输出处理结构
高性能的web服务器能够同时支持数千条连接,这些连接使得服务器可以与来自世界各地的客户端进行同行,每个客户端都向服务器打开了一条或者多条连接, 某些连接可能在快速的向web服务器发送请i去,而其他的一些连接则可能慢慢在发送,或者不经常发送,还有一些是空闲的,安静的等待将来可能出现的动作。
- 单线程的web服务器
单线程的web服务器一次只处理一个请求,知道处理完成为止,一个事务处理结束之后,才能去处理下一条连接,这种结构易于实现,但是在处理过程中,所有其他的连接会被忽略。 - 多进程以及多线程web服务器
多进程和多线程web服务器用多个进程,或者使用更高效的线程为请求进行处理,可以根据需要创建,或者预先创建一些线程或者进程。有些服务器会为每条连接分配一个线程或者进程,当服务器同时要处理成百上千甚至数以万计的连接的时候,需要的进程或者线程数量可能会消耗太多的内存或者系统资源 - 复用io的服务器
为了支持大量的连接,很多web服务器都采用了复用结构,在复用结构中,要同时监视所有连接上的活动,当连接的状态发生变化的时候,就对那条连接进行少量的处理,处理结束以后,将连接返回到开放连接列表中,等待下一次的状态变化。只有在有事情做的时候才会对连接进行处理。在空闲连接上等待的时候不会绑定线程或者进程。 - 复用的多线程web服务器
有些系统会将多线程和复用功能结合在一起,利用计算机平台上的多个cpu,多个线程中的每一个都在观察打开的连接或者打开的连接中的一个子集,并对每条连接执行少量的任务。
处理请求
一旦web服务器接收到了请求,就可以根据方法,资源,首部和可选的主体部分来对请求进行处理了。
有的方法要求请求报文中必须带有实体主体的部分的数据,其他方法允许有请求的主体部分,也允许没有,少数方法禁止在请求报文中包含实体的主体数据。
对资源的映射以及访问
web服务器是资源服务器,负责发送预先创建好的内容,以及运行在服务器上的资源生成程序所产生的动态内容
在web服务器将内容发送给客户端之前,要求将请求报文中的URI映射在web服务器上适当的内容或者内容的生成器,以识别出内容的源头。
docroot
web服务器支持各种不同类型的资源映射,最简单的资源映射形式是用请求URI作为名字来访问web服务器文件系统中的文件,通常,web服务器的文件系统中会有一个特殊的文件夹专门存放web内容,这个文件夹被称为文档的根目录,web服务器从请求报文中获得URI,并将其附加在文档根目录的后面。
虚拟托管的docroot
虚拟托管的web服务器会在同一台web服务器上提供多个web站点,每个web站点在服务器上有自己独有的文档根目录,虚拟托管web服务器会根据URI或者Host首部的IP地址或者主机名来识别使用正确文档根目录。通过这种方式,即使请求URI完全相同,托管在同一web服务器上的两个web站点可以拥有完全不同的内容了。
用户的主目录docroot
Docroot的另一种常见的应用是在web服务器上为人们提供的私有web站点,通常会把那些斜杠和那些波浪号开始,后面跟着用户名的URI映射为此用户的私有文档根目录,私有的docroot通常都是用户主目录下那个名为public_html的目录,但是可以配置为其他的值。
目录列表
web服务器可以接受对目录的URL的请求,其路径可以解析为一个目录,而不是文件,在其客户端请求目录URL时候采取不同的动作。
- 返回一个错误
- 不返回目录,返回一个特殊的默认索引文件
- 扫描目录,返回一个包含目录内容的HTML页面
大多数web服务器都会查找目录中一个名为index.html或者index.htm的文件来代替此目录,如果用户请求的是一个目录的URL,而且这个目录中有一个名为index.html的文件,服务器就会返回那个文件的内容。
动态内容的映射
web服务器还可以将URI映射为动态资源,映射到按需动态生成内容的程序上去。
服务器端包含项
很多web服务器还包含对服务器端包含项的支持,如果某个资源被标识为存在服务器端包含项,服务器就会在即将发送给客户端之前对资源进行处理。
要对内容进行扫描,可以查找特定的模板,这些模板可以是变量名,可以是嵌入式脚本,可以用变量的值或可执行脚本的输出取代特定的模板,这也是创建动态内容的一种简便方式。
访问控制
web服务器还可以为特定的资源进行访问控制,有请求到达,要访问受控资源的时候,web服务器可以根据客户但的ip地址进行访问控制,也可以通过输入密码来访问资源。
构建响应
一旦web服务器识别出了资源,就会按照请求方法中描述的动作,并返回响应报文,响应报文中包含有响应状态码,响应首部,如果生成了响应主体的话,还包含响应主体。
响应主体
如果事务处理产生了响应主体,就将内容放在响应报文中回送回去,如果有响应主体的话,响应报文通常包括
- 描述响应主体MIME类型的Content-Type首部
- 描述响应主体长度的Content-length首部
- 响应报文的主体内容
MIME类型
web服务器需要确定响应主体的MIME类型,有很多配置服务器的方法可以将MIME类型和资源关联起来。
MIME类型
web服务器可以用文件的拓展名来说明MIME类型,web服务器会为每个资源扫描一个包含了所有拓展名的MIME类型的文件,以确定是MIME类型
- 魔法分类
可以描述每个资源的内容,并将其与一个已知模式表进行匹配,以决定MIME类型,这样可能比较慢,但是很方便。 - 显示分类
可以对web服务器进行配置,使其不考虑文件的拓展名或者内容,强制特定文件或者目录内容拥有某个MIME类型。 - 类型协商
有些web服务器经过配置,可以以多种文档格式来存储资源,在这些情况下,可以通过配置web服务器,使其可以通过用户协商来决定使用那种格式。
重定向
web服务器有的时候会返回重定向响应而不是成功的报文,web服务器可以将浏览器重定向到其他的地方来执行请求,重定向的响应由返回码3xx来说明,location响应首部包含了内容的新地址或者是优选地址的URI。
- 永久搬离的资源
- 临时搬离的资源
- URL增强
- 负载均衡
- 服务器关联
- 规范目录名称
发送响应
web服务器通过发送数据也会面临着和接受数据一样的问题,服务器可能由很多条到各个客户端的连接,有的是空闲的,有的在向服务器发送数据,有的还在向服务器返回响应数据。
记录日志
当事务结束以后,web服务器会在日志文件中添加一个条目,来描述已经执行的事务