iis、apache、tomcat、weblogic、websphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了:
web服务器的基本功能就是提供web信息浏览服务。它只需支持http协议、html文档格式及url。与客户端的网络浏览器配合。因为web服务器主要支持的协议就是http,所以通常情况下http服务器和web服务器是相等的(有没有支持除http之外的协议的web服务器,作者没有考证过),说的是一回事。
应用程序服务器(简称应用服务器),我们先看一下微软对它的定义:"我们把应用程序服务器定义为“作为服务器执行共享业务应用程序的底层的系统软件”。 就像文件服务器为很多用户提供文件一样,应用程序服务器让多个用户可以同时使用应用程序(通常是客户创建的应用程序)"
通俗的讲,web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:web服务器专门处理http请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑 (business logic)。
以java ee为例,web服务器主要是处理静态页面处理和作为 servlet容器,解释和执行servlet/jsp,而应用服务器是运行业务逻辑的,主要是ejb、 jndi和jmx api等j2ee api方面的,还包含事务处理、数据库连接等功能,所以在企业级应用中,应用服务器提供的功能比web服务器强大的多。
以这样的定义,iis、apache、tomcat都可以属于web服务器,weblogic、websphere都属于应用服务器。
apache:在web服务器中,apache是纯粹的web服务器,经常与tomcat配对使用。它对html页面具有强大的解释能力,但是不能解释嵌入页面内的服务器端脚本代码(jsp/servlet)。
tomcat:早期的tomcat是一个嵌入apache内的jsp/servlet解释引擎apache tomcat就相当于iis asp。后来的tomcat已不再嵌入apache内,tomcat进程独立于apache进程运行。 而且,tomcat已经是一个独立的servlet和jsp容器,业务逻辑层代码和界面交互层代码可以分离了。因此,有人把tomcat叫做轻量级应用服务器。
iis:微软早期的iis,就是一个纯粹的web服务器。后来,它嵌入了asp引擎,可以解释vbscript和jscript服务器端代码了,这时,它就可以兼作应用服务器。当然,它与j2ee应用服务器根本无法相比,但是,从功能上说,从原理上说,它勉强可以称之为应用服务器。确切地说,它是兼有一点应用服务器功能的web服务器。
综上:apache是纯粹的web服务器,而tomcat和iis因为具有了解释执行服务器端代码的能力,可以称作为轻量级应用服务器或带有服务器功能的web服务器。weblogic、websphere因为能提供强大的j2ee功能,毫无疑问是绝对的应用服务器。对于处于中间位置的tomcat,它可以配合纯web服务器apache一起使用,也可以作为应用服务器的辅助与应用服务器一起部署:
一、tomcat与应用服务器
到目前为止,tomcat一直被认为是servlet/jsp api的执行器,也就所谓的servlet容器。然而,tomcat并不仅仅如此,它还提供了jndi和jmx api的实现机制。尽管如此,tomcat仍然还不能算是应用服务器,因为它不提供大多数j2ee api的支持。
很有意思的是,目前许多的应用服务器通常把tomcat作为它们servlet和jsp api的容器。由于tomcat允许开发者只需通过加入一行致谢,就可以把tomcat嵌入到它们的应用中。遗憾的是,许多商业应用服务器并没有遵守此规则。
对于开发者来说,如果是为了寻找利用servlet、jsp、jndi和jmx技术来生成java web应用的话,选择tomcat是一个优秀的解决方案;但是为了寻找支持其他的j2ee api,那么寻找一个应用服务器或者把tomcat作为应用服务器的辅助,将是一个不错的解决方案;第三种方式是找到独立的j2ee api实现,然后把它们跟tomcat结合起来使用。虽然整合会带来相关的问题,但是这种方式是最为有效的。。
二、tomcat与web服务器
tomcat是提供一个支持servlet和jsp运行的容器。servlet和jsp能根据实时需要,产生动态网页内容。而对于web服务器来说, apache仅仅支持静态网页,对于支持动态网页就会显得无能为力;tomcat则既能为动态网页服务,同时也能为静态网页提供支持。尽管它没有通常的web服务器快、功能也不如web服务器丰富,但是tomcat逐渐为支持静态内容不断扩充。大多数的web服务器都是用底层语言编写如c,利用了相应平台的特征,因此用纯java编写的tomcat执行速度不可能与它们相提并论。
一般来说,大的站点都是将tomcat与apache的结合,apache负责接受所有来自客户端的http请求,然后将servlets和jsp的请求转发给tomcat来处理。tomcat完成处理后,将响应传回给apache,最后apache将响应返回给客户端。而且为了提高性能,可以一台apache连接多台tomcat实现负载平衡。
下面让我们来细细道来:
web服务器(web server)
web服务器可以解析(handles)http协议。当web服务器接收到一个http请求(request),会返回一个http响应 (response),例如送回一个html页面。为了处理一个请求(request),web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如cgi脚本,jsp(javaserver pages)脚本,servlets,asp(active server pages)脚本,服务器端(server-side)javascript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个html的响应(response)来让浏览器可以浏览。
要知道,web服务器的代理模型(delegation model)非常简单。当一个请求(request)被送到web服务器里来时,它只单纯的把请求(request)传递给可以很好的处理请求 (request)的程序(译者注:服务器端脚本)。web服务器仅仅提供一个可以执行服务器端(server-side)程序和返回(程序所产生的)响应(response)的环境,而不会超出职能范围。服务器端(server-side)程序通常具有事务处理(transaction processing),数据库连接(database connectivity)和消息(messaging)等功能。
虽然web服务器不支持事务处理或数据库连接池,但它可以配置(employ)各种策略(strategies)来实现容错性(fault tolerance)和可扩展性(scalability),例如负载平衡(load balancing),缓冲(caching)。集群特征(clustering—features)经常被误认为仅仅是应用程序服务器专有的特征。
应用程序服务器(the application server)
根据我们的定义,作为应用程序服务器,它通过各种协议,可以包括http,把商业逻辑暴露给(expose)客户端应用程序。web服务器主要是处理向浏览器发送html以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法 (或过程语言中的一个函数)一样。
应用程序服务器的客户端(包含有图形用户界面(gui)的)可能会运行在一台pc、一个web服务器或者甚至是其它的应用程序服务器上。在应用程序服务器与其客户端之间来回穿梭(traveling)的信息不仅仅局限于简单的显示标记。相反,这种信息就是程序逻辑(program logic)。正是由于这种逻辑取得了(takes)数据和方法调用(calls)的形式而不是静态html,所以客户端才可以随心所欲的使用这种被暴露的商业逻辑。
在大多数情形下,应用程序服务器是通过组件 (component) 的应用程序接口(api)把商业逻辑暴露(expose)(给客户端应用程序)的,例如基于j2ee(java 2 platform, enterprise edition)应用程序服务器的ejb(enterprise javabean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括安全(security),事务处理(transaction processing),资源池(resource pooling),和消息(messaging)。就象web服务器一样,应用程序服务器配置了多种可扩展(sc