web服务器
- 对多种使用不同类型软硬件的web服务器进行调查
- 介绍如何用perl编写简单的诊断wev服务器
- 一步一步的解释web服务器是如何处理http事务的
5.1各种形状和尺寸的web服务器
web服务器会对http请求处理并提供响应。可以是web服务器的软件,也可以是提供web页面的特定设备或计算机。
5.1.1web服务器的实现
web服务器实现了http和相应的tcp连接处理。负责web服务器提供的资源,以及web服务器的配置、控制及扩展方面的管理。
web服务器逻辑实现了http协议,管理着web资源,并负责,提供web服务器的管理功能。web服务器逻辑和操作系统共同负责管理tcp连接。底层操作系统负责管理计算机系统的硬件细节,并提供tcp网络的支持、负责装载wev资源的文件系统以及控制当前计算活动的进程管理功能。
web服务器的不同形式
- 可以在标准的计算机系统上安装并运行通用的web服务器
- 如果不想那么麻烦安装软件,可以买一台web服务器设备。
- 随着微处理器奇迹般的出现,有些公司可以在少量的计算机芯片上实现嵌入式web服务器使其称为完美的消费设备管理控制台
5.1.2通用软件web服务器
通用软件web服务器都运行在标准的、有网络功能的计算机系统上。其中apache占据了60%的市场
5.1.3web服务器设备
web服务器设备(web server appliance)是预先打包好的软硬件解决方案。厂商会在他们的计算机平台上预先安装好软件服务器,并将软件配置好。
5.1.4嵌入式web服务器
嵌入式服务器(enbeded server)是要嵌入到消费类产品中的小型web服务器。有些嵌入式web服务器可以在小于一平方英寸的空间内实现。
5.2最小的perl web服务器。
...
5.3实际的web服务器会做些什么
- 建立连接-接受客户端的连接,或者如果不希望建立就关闭连接。
- 接受请求-从网络中读取一条http请求报文
- 处理请求-对请求方存文进行解释,并采取行动
- 访问资源-访问报文中指定的资源
- 构建响应-创建带有正确首部的http响应报文
- 发送响应-将响应回送给客户端
- 记录事务处理过程-将已完成的事务记录在一个日志中
5.4第一步-接受客户端连接
如果客户端已经打开了一条到服务器的持久连接,可以使用那条连接发送请求。否则客户端要打开一条新的到服务器的连接。
5.4.1处理新连接
客户端请求一条到web服务器的tcp连接时,web服务器会建立连接,判断另一端是那个客户端,从tcp连接中将ip地址解析出来。一旦连接建立起来并被接受,服务器就会将新的连接添加到现存的web服务器连接列表中,做好监视连接上数据传输的准备。
web服务器可以拒绝,或关闭任意一条连接。
5.4.2客户端主机名识别
可以用反向dns对大部分web服务器进行配置,以便将客户端ip转换为客户端主机名。web服务器可以将客户端主机名用于详细的访问控制和日志记录。主机名查找可能会花费很长时间,这样会减低web服务器事务处理的速度,大容量服务器会禁止主机名解析,或只允许对特定内容进行解析。
5.4.3通过ident确定客户端用户
有些web服务器支持ietf的ident协议。服务器通过ident协议发http连接的用户名。这些信息端web服务器的日志记录特别有用-流行的通用日志格式(common log format)的第二个字段中就包含了每条http请求的ident用户名。
ident可以在组织内部很好的工作,但在公共网络不能很好的工作,原因如下:
- 很多客户端pc没有ident识别协议的守护进程
- ident协议会使http事务产生时延
- 很多防火墙不允许ident流量进入
- ident协议不安全,容易伪造
- ident协议不支持虚拟ip
- 暴露客户端的用户名还涉及隐私问题
5.5第二步-接受请求报文
连接上有数据到达时,web服务器会从网络中读取数据,并将请求报文的内容解析出来。
- 解析请求行,查找请求方法,指定的资源标识符以及版本号,各项用空格分隔,以回车换行结束
- 读取以crlf结尾的报文首部
- 检测以攒浪费结尾的标志首部结束的空行
- 如果有的话,读取请求主体
解析请求报文,web服务器从网络上接受输入数据,网络连接可能随时出现延迟。web服务器从网络中读取数据,将部分办新闻数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止。
5.5.1报文的内部表示法
有些web服务器会用便于进行报文操作的内部数据结构来存储请求报文。这样可以快速访问特定的首部。
5.5.2连接的输入输出处理结构
不同的web服务器会以不同的方式为请求服务
- 单线程服务器
一次处理一个请求,知道完成为止。效率低,性能差。 - 多进程和多线程服务器
以高效的多线程处理事务。可能消耗太多内存或系统资源。 - 复用io的服务器
同时监视所有的连接上的活动。 - 复用多线程的服务器
在多线程中打开连接
5.6第三步-处理请求
一旦服务器收到请求就可以根据方法、资源、首部、可选主体进行处理了。
第四步-对资源的映射及访问
web服务器是资源服务器,他们发送预先创建好的内容,比如html或则动态生成的资源。在服务器将内容传送给客户端之前,要将请求报文的url映射为服务器的内同或内容生成器,以识别内容的源头。
5.7.1docroot
web服务器支持不同类型的资源映射,最简单的资源映射形式就是用请求url作为名字访问服务器的文件系统的文件。通常服务器有一个特殊的文件夹存放web内容,称为文档根目录(document root或docroot)
1.虚拟托管的docroot
虚拟托管的服务器会在同一台web服务器上提供多个web站点,每个站点在服务器上都有自己的文档根目录,虚拟服务器根据url或host首部的ip地址或主机名识别要使用的正确文档根目录。
1.用户主目录docroot
docroot的另一个常见应用是在web服务器上为人们提供私有的web站点。通常会把以/~开始,后面跟着用户名的url映射为私有文档根目录。
5.7.2目录列表
web服务器可以接受yui个对目录url的请求,其路径可以解析为一个目录,而不是文件。可以对服务器配置,使请求目录时采取不同动作。
- 返回一个错误
- 不返回目录。返回一个特殊的默认“索引”文件。
- 扫描目录,返回一个包含目录的html页面
5.7.3动态内容资源的映射
web服务器可以将url映射为动态资源。实际上,有一大类名为应用程序服务器的web服务器会将服务器连接到复杂的后端程序。
5.7.4服务器端包含项
很多服务器还提供了对服务器端包含项(ssi)的支持。如果某个资源被标志为存在服务器端包含项,服务器就回在发送给客户端之前对其资源内容进行处理。要对内容进行扫描。以查找特定的模板,取代特定的模板。这是创建动态内容的简便方式。
5.5.7访问控制
web服务器可以为特定的资源进行访问控制。比如客户端的ip或者要求提供密码。
5.8第五步-构建响应
一旦服务器识别了资源,就执行请求方法描述的动作,并返回响应报文。
5.8.1响应实体
如果事务处理产生了响应主体就将内容放在响应报文中送过去。如果有响应主体,响应报文通常包括:
- 描述类响应主体的mime类型的content-type首部
- 描述响应报文长度的content-length首部
- 实际报文的主体内容
5.8.2mime类型
服务器负责确定响应主体的mime类型
- mime类型:
服务器可以通过文件的扩展名说明mime类型。 - 魔法分类:
apache服务器可以扫描每一个资源的内容,并将其与一个已知的模式表(魔法文件)匹配,以决定每个文件的mime类型。这样做很慢,但很方便,尤其文件没有标准扩展名时。 - 显式分类:
可以对web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个mime类型。 - 协议协商
有些web服务器经过配置,可以以多种文档格式来存储资源。在这种请求下,可以配置web服务器,使其可以通过与用户的协商来决定使用那种格式最好。
5.8.3重定向
服务器有时会返回重定向响应而不是成功的报文。重定向响应由返回码3xx说明。location响应首部包含了内容的新地址。重定向用于以下情况
- 永久删除的资源
- 临时删除资源
- url增强
- 负载均衡
- 服务器相关
- 规范目录名称
5.9第六步-发送响应
web服务器通过连接发送数据有时也会面临与接受数据一样的问题。服务器可能有很多到客户端的连接。服务器要记录连接状态,还要特别注意持久连接的处理,要特别小心的计算content-length首部,不然客户端就不知道响应什么时候结束了。
5.10第七步-记录日志
当事务结束,web服务器会在日志系统添加一个条目,来描述已执行的事务。