如果你决定要旅行那就别怕风雨兼程。
WEB服务器应用程序服务器HTTP服务器有何区别IISApacheTomcatWeblogicWebSphere 都各属于哪种服务器这些问题困惑了很久今天终于梳理清楚了
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服务器强大的多
以这样的定义IISApacheTomcat都可以属于Web服务器WeblogicWebSphere都属于应用服务器
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服务器WeblogicWebSphere因为能提供强大的J2EE功能毫无疑问是绝对的应用服务器对于处于中间位置的Tomcat它可以配合纯Web服务器Apache一起使用也可以作为应用服务器的辅助与应用服务器一起部署
到目前为止Tomcat一直被认为是Servlet/JSP API的执行器也就所谓的Servlet容器然而Tomcat并不仅仅如此它还提供了JNDI和JMX API的实现机制尽管如此Tomcat仍然还不能算是应用服务器因为它不提供大多数J2EE API的支持
很有意思的是目前许多的应用服务器通常把Tomcat作为它们Servlet和JSP API的容器由于Tomcat允许开发者只需通过加入一行致谢就可以把Tomcat嵌入到它们的应用中遗憾的是许多商业应用服务器并没有遵守此规则
对于开发者来说如果是为了寻找利用ServletJSPJNDI和JMX技术来生成Java Web应用的话选择Tomcat是一个优秀的解决方案但是为了寻找支持其他的J2EE API那么寻找一个应用服务器或者把Tomcat作为应用服务器的辅助将是一个不错的解决方案第三种方式是找到独立的J2EE API实现然后把它们跟Tomcat结合起来使用虽然整合会带来相关的问题但是这种方式是最为有效的
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服务器传送serves页面使浏览器可以浏览然而应用程序服务器提供的是客户端应用程序可以调用call的方法methods确切一点你可以说:Web服务器专门处理HTTP请求request但是应用程序服务器是通过很多协议来为应用程序提供serves商业逻辑 business logic
下面让我们来细细道来:
Web服务器可以解析handlesHTTP协议当Web服务器接收到一个HTTP请求request会返回一个HTTP响应 response例如送回一个HTML页面为了处理一个请求requestWeb服务器可以响应response一个静态页面或图片进行页面跳转redirect或者把动态响应dynamic response的产生委托delegate给一些其它的程序例如CGI脚本JSPJavaServer Pages脚本servletsASPActive Server Pages脚本服务器端server-sideJavaScript或者一些其它的服务器端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集群特征clusteringfeatures经常被误认为仅仅是应用程序服务器专有的特征
根据我们的定义作为应用程序服务器它通过各种协议可以包括HTTP把商业逻辑暴露给expose客户端应用程序Web服务器主要是处理向浏览器发送HTML以供浏览而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用应用程序使用此商业逻辑就象你调用对象的一个方法 或过程语言中的一个函数一样
应用程序服务器的客户端包含有图形用户界面GUI的可能会运行在一台PC一个Web服务器或者甚至是其它的应用程序服务器上在应用程序服务器与其客户端之间来回穿梭traveling的信息不仅仅局限于简单的显示标记相反这种信息就是程序逻辑program logic正是由于这种逻辑取得了takes数据和方法调用calls的形式而不是静态HTML所以客户端才可以随心所欲的使用这种被暴露的商业逻辑
在大多数情形下应用程序服务器是通过组件 component 的应用程序接口API把商业逻辑暴露expose给客户端应用程序的例如基于J2EEJava 2 Platform, Enterprise Edition应用程序服务器的EJBEnterprise JavaBean组件模型此外应用程序服务器可以管理自己的资源例如看大门的工作gate-keeping duties包括安全security事务处理transaction processing资源池resource pooling和消息messaging就象Web服务器一样应用程序服务器配置了多种可扩展scalability和容错fault tolerance技术
例如设想一个在线商店网站提供实时定价real-time pricing和有效性availability信息这个站点site很可能会提供一个表单form让你来选择产品当你提交查询 query后网站会进行查找lookup并把结果内嵌在HTML页面中返回网站可以有很多种方式来实现这种功能我要介绍一个不使用应用程序服务器的情景和一个使用应用程序服务器的情景观察一下这两中情景的不同会有助于你了解应用程序服务器的功能
在此种情景下一个Web服务器独立提供在线商店的功能Web服务器获得你的请求request然后发送给服务器端server- side可以处理请求request的程序此程序从数据库或文本文件flat file译者注:flat file是指没有特殊格式的非二进制的文件如properties和XML文件等中查找定价信息一旦找到服务器端server-side程序把结果信息表示成formulateHTML形式最后Web服务器把会它发送到你的Web浏览器
简而言之Web服务器只是简单的通过响应responseHTML页面来处理HTTP请求request
情景2和情景1相同的是Web服务器还是把响应response的产生委托delegates给脚本译者注:服务器端 server-side程序然而你可以把查找定价的商业逻辑business logic放到应用程序服务器上由于这种变化此脚本只是简单的调用应用程序服务器的查找服务lookup service而不是已经知道如何查找数据然后表示为formulate一个响应response这时当该脚本程序产生HTML响应response时就可以使用该服务的返回结果了
在此情景中应用程序服务器提供serves了用于查询产品的定价信息的商业逻辑服务器的这种功能functionality没有指出有关显示和客户端如何使用此信息的细节相反客户端和应用程序服务器只是来回传送数据当有客户端调用应用程序服务器的查找服务lookup service时此服务只是简单的查找并返回结果给客户端
通过从响应产生response-generatingHTML的代码中分离出来在应用程序之中该定价查找逻辑的可重用性更强了其他的客户端例如收款机也可以调用同样的服务service来作为一个店员给客户结帐相反在情景1中的定价查找服务是不可重用的因为信息内嵌在HTML页中了
总而言之在情景2的模型中在Web服务器通过回应HTML页面来处理HTTP请求request而应用程序服务器则是通过处理定价和有效性availability请求request来提供应用程序逻辑的
现在XML Web Services已经使应用程序服务器和Web服务器的界线混淆了通过传送一个XML有效载荷payload给服务器Web服务器现在可以处理数据和响应response的能力与以前的应用程序服务器同样多了
另外现在大多数应用程序服务器也包含了Web服务器这就意味着可以把Web服务器当作是应用程序服务器的一个子集subset虽然应用程序服务器包含了Web服务器的功能但是开发者很少把应用程序服务器部署deploy成这种功能capacity译者注:这种功能是指既有应用程序服务器的功能又有Web服务器的功能相反如果需要他们通常会把Web服务器独立配置和应用程序服务器一前一后这种功能的分离有助于提高性能简单的Web请求request就不会影响应用程序服务器了分开配置专门的Web服务器集群clustering等等而且给最佳产品的选取留有余地