Web服务器是怎样工作的
在许多用户看来,一个Web网站的成败主要在于它所提供的内容和功能,殊不知支持这些内容和功能的Web服务器才是真正的幕后英雄。那么,一个Web服务器是怎样工作的呢?
几年前,当Web服务器刚刚出现的时候,它所支持的应用只是简单的HTML文件和图像的浏览,当Web服务器接到一个对Web页面的请求,如ml,就会通过URL(Uniform Resource Locator-统一资源定位器)定位到相应的宿主文件服务器上,并找到相应的文件 ml,然后从宿主文件服务器上下载该文件并通过HTTP协议把它传输给Web浏览器(Web Browser)。当然,这只是一个基础功能,Web服务器同Web浏览器之间的关系远非这样简单。Web应用的最重要的一个扩展是动态内容的引入。例如,Web服务器可以根据用户输入的请求,去直接或间接地创建Web网页,然后返回给Web浏览器。最早实现动态内容应用的方法是通过CGI(Comman Gateway Interface公共网关接口),它对Web服务器上程序的运行及Web服务器同Web浏览器之间动态内容的传输有一个基本的定义。如图2 所示。
Web应用的另一个进展是HTTPS(HyperText Transmission Protocol, Secure安全超文本传输协议)的出现,这种协议保证了Web服务器和Web浏览器之间的通信安全,从而使得电子交易成为可能。
Web服务器同Web浏览器之间的通信是通过HTTP协议进行的,那么,什么是HTTP协议?简单说,HTTP协议是Web浏览器和Web服务器之间的应用层协议,它基于TCP/IP协议,是通用的、无状态的、面向对象的协议。它的作用原理包括四个步骤:
图2 CGI定义图
连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接成功。
请求:Web浏览器通过socket向Web服务器提交请求。
应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
这样,Web服务器的处理过程包括了一个完整的逻辑阶段:接受连接——产生静态或动态内容并把它们传回浏览器——关闭连接——接受下一个连接,如此进行下去。可以想象,在访问者多的情况下,服务器必然会应接不暇。解决这个问题可以借助两种技术:多线程和多进程。Web服务器支持Unix系统的端口监视模块(一种多进程的模式)、多线程、多进程或两种技术的混合。
有了连接,Web服务器怎样向Web浏览器提供内容呢?这里的关键是内容必须能为浏览器识别并且表现出来。这其中决定如何显示内容的主要机制是MIME(Multiple Purpose Internet Mail Extension-多用途因特网邮件扩展)类型,MIME会告诉Web浏览器什么样的文档将被发送,而且,这种类型的鉴别并不局限于简单的图象文档和HTML文档。例如,Apache WebServer 的mine.type配置文件中有370种缺省的MIME类型,而且这还不是MIME类型的全部。MIME类型通过与文件后缀相关的类型/子类型语法来区分,例如,包含MPEG视频内容的文件会有mpeg、mpg或mpe的后缀。
Web服务器的作用最终体现在对内容特别是动态内容的提供上,这也是Web服务器同应用服务器的根本不同,Web服务器主要负责同Web浏览器交互时提供动态产生的HTML文档(除了提供HTML文档服务外,Web服务器还提供诸如XML格式的应用数据,也就是说,Web服务器不仅仅提供HTML文档,还可以在更大的范围内与各种数据源建立连接,为Web浏览器提供更丰富的内容。)
实现Web动态内容的技术有很多,第一种是CGI,它根据用户输入的请求动态地传送HTML数据。CGI并不是开发语言,它只是能够利用为它编写的程序来实现Web服务器的一种协议。由于每一次对于动态内容的请求都需要启动一个新的CGI程序,因而会增加Web服务器的负担,所以CGI的一个很大的缺陷是容易影响Web服务器的速度。
Microsoft ASP(Active Server Pages-动态服务器页面)技术由嵌入在IIS里的VBScript解释器构成,同时它还支持多种脚本语言,包括JavaScript、PerlScript以及VBScript,以COM为基础,它可以很容易地访问其他服务器的软件组件。
PHP象JSP和ASP技术一样是由一套放在HTML文档里的附加的代码标记组成。不同之处是它专为开发Web网页而用,所以用它开发的应用会比用VBScript或JSP等开发的相应的应用更为简洁。
今天所有的Web服务器都支持Perl的加速解决方案。Apache的mod_perl免费解决方案就把Perl嵌入了Apache服务器。这样不仅提高了Perl代码的解释速度,而且由于mod_perl缓存作用,代码的执行效率也会有很大的提高。Mod_perl还同Apache紧密相连,因此Perl开发人员可以象C语言开发人员编写底层的Apache API程序一样控制Web服务器的工作。
在系统运行时,Web服务器往往要支撑大量而又密集的用户点击和对动态内容的需求,所以即使再高档的服务器设备,面对不断增加的用户,单位时间内所支持的访问量也是会有一个限度,尤其是对于动态内容较多的情况,因为动态内容的应用需要频繁地调用数据库的数据和应用程序,会占用大量的服务器资源。这时就需要在多个服务器设备之间或多个站点之间分散服务器的负载。
负载均衡的方法有很多,最简单的方法是在不同的服务器之间分配网站的内容。例如,在一个服务器上存放静态HTML页面,另一个上面存放图象文件,而在第三台上运行所有的CGI程序。不过很明显,这种方法效率不会很高,因为它无法在主机之间实现自动的内容分配,如果其中某一方面的内容过多,仍然会形成负载瓶颈。