一、基本的HTTP服务器
1、简介
对于一个服务器应用程序,有四方面的内容是需要了解:
客户端、服务器端、客户端与服务器端的协议,服务器端能够提供的资源
客户端 通过HTTP协议发送URI 到服务器端,
服务器端 通过HTTP协议返回响应内容 给客户端
2、HTTP服务器功能
根据客户端请求,响应本地文件或者使用本地应用程序(即CGI程序)生成响应内容,返回给客户端
一个WEB服务器的基本内部流程如下:
(1)初始化:即启动服务器程序,启动时向运行主机请求将端口80作为服务器端口
(2)请求——响应循环:
1)等待并接受一个客户端请求
2)对请求进行检查
3)将请求的URL映射为特定的文件(存在则返回给客户端,不存在则返回错误)
以上是最简单的过程,实际一个成熟的WEB服务器还需包括以下多种功能
(1)完整实现HTTP/0.9,HTTP/1.0,HTTP/1.1协议
(2)能够处理并发请求,支持多进程或多线程
(3)提供开发接口,允许增加额外功能
(4)实现服务器安全机制
(5)动态内容生成(允许通过CGI,脚本语言和服务器段包含SSI生成动态WEB页面)
(6)支持虚拟主机
(7)支持代理功能
(8)允许根据MIME类型协商选择合适的返回资源
管理角度还需考虑:
(1)7*24小时运行的健壮性和稳定性
(2)易配置型
(3)用户可以在不停止服务器的情况下修改配置
(4)易管理性,管理员可以通过辅助工具对服务器进行有效的管理
(5)丰富的日志
3、WWW文档
WEB服务器上的文档是以层状或树形结构进行组织的。
HTML中的超链接使用文档名来指向对应的信息,链接可以是完整的文档名字(绝对名称:www.server.org/there/xx.html),或当前文档的名字(相对名称:./xx.gif)。相对名称通常用于内嵌的图像。一般一个html文档所包含的各个部分都在同一地方。
但是,WEB文档树并不能真实反映Web文档的组织结构。web文档的实际组织结构有三种最重要的形式:
(1)所有文档位于同一台机器上,构成一棵树
(2)文档分布于不同的机器上,相互之间没有形成镜像
(3)文档在不同的机器上形成镜像
4、工作方式(WEB服务器的工作原理及步骤)
(1)等待客户请求:侦听一个端口
(2)客户请求到来:客户浏览器发送ASCII字符串(请求)到服务器,WEB服务器将请求读入内存
(3)接受客户请求:WEB服务器对请求按照HTTP协议进行解码来确定进一步的动作,涉及内容包括:方法(GET),客户端所请求的文档,及浏览器使用的协议
(4)读取其他信息:WEB服务器根据需求去读取请求的其他部分信息(用于描述浏览器及其能力的元信息)
(5)完成请求的其余动作:WEB服务器在其文档树中搜索请求的文件Index.html
查找成功:文件将被发送出去,首先发送一个响应码及一些描述信息,再读取磁盘文件输出到网络
处理失败:返回错误提示信息
(6)关闭文件和网络连接,结束会话
二、Apache功能
完全实现http0.9,1.0,1.1。及协议中没有的内容:比如虚拟主机。各基本功能如下:
1、虚拟主机
虚拟主机是指在一个机器上运行多个Web站点的机制
虚拟主机的实现包括以下三种方式:
(1)“基于IP”技术:web服务器中配置多个IP地址,并且每一个逻辑Web服务器使用一个IP地址。
优点:最简单
缺点:扩展性不好,一台机器所能存在的物理IP地址有限。
IP地址个数有限
(2)“基于端口”技术:web服务器只有一个IP地址,不同的web服务器使用不同的端口进行侦听。
缺点:用户必须显式给出正确的请求端口
(3)“基于HOST域”技术:web服务器只有一个IP地址,同时多个域名被映射到该IP地址上。
所有web服务器侦听同一个端口,根据http请求中的Host域对请求进行区分(http1.1以上才具备)。
Apache支持以上的三种方式的虚拟主机,并可通过mod_vhost_alias模块对类似的虚拟主机进行配置
2、内容协商
Apache对于同一个文档可能会保存多个不同的版本,如何选择最适合给定用户的版本,有两种办法进行客户端和服务器端资源的协商:
它们可以单独或混合使用。混合使用中有一种叫“透明的协商方法”,可在缓冲使用由初始服务器提供的代理驱动协商信息,为后续的请求提供服务器驱动协商发生时,使用该方法。
(1)服务器端驱动的内容协商
即对需要发送到客户端的具体文档版本由服务器端决定。
通过使用“Accept”请求域字段,客户端会提供一系列的它能够接受的格式列表,根据这个域,服务器会选择最适合客户端的内容。
服务器的选择可能会基于语言、内容编码、请求消息中特殊报文字段的内容,及隶属于请求的其他信息(比如IP地址)
优点:服务器想和第一个应答一起把它的“最佳猜测”发送给客户端时比较好
缺点:1)不能准确判断最佳协商
2)客户端在请求中描述自己能力的效率很低
3)使得初始服务器的实现及对请求生成应答的算法变得复杂
4)可能会限制一个公共缓存的能力,使其对多个用户的请求使用同样的应答。
Accept-XXX都是用于协商
(2)客户端驱动的内容协商(由浏览器完成)
3、持续连接
持续连接:就是某个连接在打开后不立即关闭,而是继续使用,后续的数据传输都基于该连接
为了使用持续连接,客户端和服务器之间都会使用“Connection:keep_alive”请求域(默认情况下连接就是持续连接),除非进行了特殊的指定
使用“Connection:close”关闭使用持续连接。
Apache提供配置指令,允许限制在同一连接上的处理请求的数目,以及处理超时的时间,一旦超过该处理时间,连接就将关闭。
4、缓存
在分布式架构下,可以使用缓存应答的方式改善系统的性能,从而加快对客户端的响应速度。
HTTP1.1中缓存的设计目标是在很多情况下降低发送请求的必要性,以及降低发送完整应答的必要性。
降低发送请求:使用过期机制实现,从而减少所需要的网络回合
降低发送完整应答:使用验证机制实现,从而减少网络带宽需求
HTTP1.1中相关的缓存字段:
(1)Expires:声明一个网页或URL地址不再被浏览器缓存的时间
(2)Cache-Control:可以声明多个元素,用来指明页面被缓存的最大时限,如何被缓存的,如何被转换到另一个不同的媒介的,以及如何被存放在持久媒介的。
(3)Last_Modified:是条件请求相关的两个字段,用于验证请求询问服务器页面是否已经更改。可避免重复发送文件给浏览器,不过仍然会有HTTP协议请求。
一般纯静态页面本身都会有Last-Modified信息,Apache会读取页面文件中的Last-Modified信息,并添加到HTTP响应头部
对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,Apache会把当前时间作为Last-Modified返回给浏览器。
无论是纯静态页面还是动态页面,FireFox浏览器都巧妙的按照接受到服务器响应的时间设置缓存页面的Last-Modified。
(4)ETag:用于提供更加严格的验证。
Apache会在默认情况下,对所有静态、动态文件的响应头添加ETag字段,在httpd.conf文件中可以通过FileETag指令配置该选项。
FileETag指令配置了当文档基于一个文件时用以创建ETag响应头的文件的属性。
在多台负载均衡的服务器环境下,同一个文件会有不同的ETag或文件修改日期,浏览器每次都会重新下载。
5、访问控制和安全
通过认证、授权和访问控制(AAA模块)的一系列安全措施,可以确保受控资料的安全
(1)访问控制
只有一个模块实现了访问控制
(2)认证
包括两种:基本认证和摘要认证
(3)授权
Apache通过解析全局及本地配置文件.htaccess来决定用户的授权身份。
6、动态内容的生成
一个Web服务器最简单的功能就是将存放于服务器上的静态的HTML文件发送给客户端。
Apache提供了动态生成页面的功能:
(1)使用CGI脚本:Web服务器执行一个外部应用程序,用以解释脚本代码并且返回执行输出后的HTML至Web服务器,再转发给客户端
(2)使用额外的模块来支持脚本语言(例如mod_perl):脚本语言通过上下文环境解释它,脚本模块为脚本语言提供执行环境和允许脚本访问脚本以外数据的API
服务器端脚本分两类:
1)支持嵌入脚本的HTML文件:比如:asp,php等文件,脚本被包含到特定标签中,被脚本引擎模块识别,执行后再输出为HTML文本,并将原有脚本替换。
2)完全由程序生成的HTML文档:主要是两种:CGI程序(C、C++或perl程序),Java servlets程序