应用服务器和Web服务器有什么区别?

893

应用服务器和Web服务器有什么区别?

28个回答

713

大多数情况下,Web服务器和应用程序服务器这两个术语可以互换使用。

以下是Web服务器和应用程序服务器功能特性方面的一些关键区别:

  • Web服务器旨在提供HTTP内容。应用程序服务器也可以提供HTTP内容,但不仅限于HTTP。它可以提供其他协议支持,例如RMI/RPC。
  • Web服务器主要设计用于提供静态内容,尽管大多数Web服务器都具有插件来支持Perl、PHP、ASP、JSP等脚本语言,通过这些服务器可以生成动态HTTP内容。
  • 大多数应用程序服务器都将Web服务器作为不可或缺的组成部分,这意味着应用程序服务器可以执行Web服务器所能执行的所有操作。此外,应用程序服务器还拥有支持应用程序级服务的组件和功能,例如连接池、对象池、事务支持、消息服务等。
  • 由于Web服务器非常适合处理静态内容,而应用程序服务器适合处理动态内容,因此大多数生产环境下的Web服务器都充当应用程序服务器的反向代理。这意味着在服务页面请求时,Web服务器通过解释请求来提供静态内容(例如图像/静态HTML)。通过某种过滤技术(通常是所请求资源的扩展名),Web服务器识别动态内容请求,并将其透明地转发到应用程序服务器。

这样的配置示例是Apache Tomcat HTTP服务器和Oracle(曾用名BEA)WebLogic服务器。Apache Tomcat HTTP服务器是Web服务器,Oracle WebLogic是应用程序服务器。

在某些情况下,服务器是紧密集成的,例如IIS和.NET运行时。IIS是Web服务器。当配备有.NET运行时环境时,IIS能够提供应用程序服务。


21
JBoss(现在称为WildFly)也是一个著名的应用程序服务器的例子 :D - KNU
5
好的,既然我们可以使用应用服务器而不是Web服务器,那么为单个应用程序拥有Web服务器和应用服务器两者的优势是什么?在性能方面,哪种选择最佳? - ONE_FE
51
"Apache Tomcat HTTP服务器是Web服务器,而Oracle WebLogic是应用服务器。" 首先,Apache Tomcat和Apache HTTP服务器是两个不同的产品。并且这并不是一个准确的陈述。Apache Tomcat是一个应用服务器。当然,它也可以提供网页服务,但它是用于部署Java的应用服务器。我知道很多人会随意使用“Web服务器”这个术语,但这只会让人们感到困惑。 - ironarm
28
Apache Tomcat不是一个Web服务器,而是运行Java Servlet的应用服务器。Apache HTTP服务器则是一个Web服务器。并没有叫做Apache Tomcat HTTP服务器的服务器。 - Abhishek Pathak
3
将Apache Tomcat和Apache HTTPD混淆是错误的。它们是两个不同的软件,具有不同的功能和用途。Apache HTTPD是一个Web服务器,可以处理静态内容和动态内容,例如PHP脚本和CGI脚本。而Apache Tomcat是一个Web应用程序服务器,用于运行Java Web应用程序。它可以与Apache HTTPD集成,以便在同一台机器上运行Java应用程序和其他Web应用程序。 - Bacon Bits
显示剩余5条评论

185

以下是一份详细的答案,其中包含一些场景,以便更清楚地了解二者的差异和相似之处,以及它们如何共同工作。

应用服务器是一个有时与Web服务器混淆的术语。虽然Web服务器主要处理HTTP协议,但应用服务器处理几种不同的协议,包括但不限于HTTP。

Web服务器的主要工作是显示网站内容,而应用服务器则负责逻辑,用户与显示内容之间的交互。应用服务器与Web服务器共同工作,其中一个显示内容,另一个进行交互。

在服务器和客户端之间来回传输的信息不仅限于简单的展示标记,还包括两者之间的交互。

在大多数情况下,服务器通过组件API(例如J2EE(Java 2平台)EJB(企业JavaBean)和其他不同的应用软件模型)创建此交互。

enter image description here

一个示例:

理解应用服务器与Web服务器共同工作的场景和没有应用服务器的场景之间差异的最佳方式是通过一个在线商店。

场景1:没有应用服务器的Web服务器

你有一个只有Web服务器而没有应用服务器的在线商店。该站点提供一个显示屏,您可以从中选择产品。当您提交查询时,网站执行查找并将HTML结果返回给其客户端。Web服务器直接将您的查询发送到数据库服务器(请耐心等待,我将在我们的下一个要点中解释这一点),并等待响应。一旦收到,Web服务器将响应制成HTML文件并将其发送到您的Web浏览器。每次运行查询时,服务器和数据库服务器之间的来回通信都会发生。

情境2:带有应用服务器的Web服务器

如果要运行的查询已经以前完成,且数据自那之后未更改,则服务器将生成结果,而无需将请求发送到数据库服务器。这允许实时查询,其中第二个客户端可以访问相同的信息并接收实时、可靠的信息,而无需向数据库服务器发送另一个重复查询。服务器基本上充当数据库服务器和Web服务器之间的中间人。这使得所提取的信息可以被重复使用,而在第一种情况下,由于此信息嵌入在特定和“定制”的HTML页面中,这不是一个可重复使用的过程。第二个客户端将不得不再次请求信息并接收包含所请求信息的另一个嵌入式HTML页面-非常低效。更不用说这种类型的服务器非常灵活,因为它能够管理自己的资源,包括安全性、事务处理、消息传递和资源池。

为了支持如此多样化的复杂任务,此服务器必须具有内置的冗余性、强大的处理能力和大量的RAM以处理所有实时获取的数据。


18
即使是对于Web应用程序来说,这并不准确/令人困惑(即应用服务器一词不适用于非Web应用程序)。仅考虑Web的情况:Web服务器包括处理Web请求(HTTP)的软件(如Apache、Nginx)。应用服务器包含/公开应用程序(例如PHP代码)。它们可能是同一台机器,也可能不是-例如,将nginx放在一个机器上(Web服务器),将请求转发到另一台机器上的php-fpm(应用服务器)被认为是正常的做法,而php-fpm本身没有任何HTTP访问权限(仅公开给自身的端口)。 - AD7six
15
重新阅读所提供的例子后,我并没有看到任何真正清晰明了的内容 - 这些描述大多与缓存有关。应当清楚的是,Web服务器是软件,应用程序也是软件。如果它们部署在同一台机器上,那么可以用任何你喜欢的方式来称呼这台机器。如果它们在不同的机器上,通常会将运行Web服务器的机器称为Web服务器,将运行应用程序的机器称为应用服务器。您通常会根据负载和负载平衡来进行分割。总体而言,我认为这个答案没有提供任何有用的信息。 - AD7six
1
@AD7six 我的回答意在补充其他答案,也就是说其他答案已经回答了你所问的问题,我的回答只是对此的延伸。 - Durai Amuthan.H
你的例子有些令人困惑。此外,你的回答似乎并不补充其他答案,因为你只提到了这是一个详细的回答,介绍了Web服务器和应用服务器之间的差异和相似之处。AD7six说得很对,并且解释得很清楚。请编辑一下你的例子。 - Wolverine
当一个请求进入Web服务器(nginx)时,它如何知道特定文件的请求(比如page1.php或image1.png)是要发送到应用服务器(page1.php),还是直接返回该文件(image1.png)? - variable
显示剩余2条评论

152

这两个术语非常通用,有些情况下一个包含另一个,反之亦然。

  • Web服务器:使用http协议向web提供内容。

  • 应用服务器:托管和暴露业务逻辑和流程。

我认为主要的观点是,Web服务器通过http协议公开所有内容,而应用服务器并不限于此。

话虽如此,在许多场景中,您会发现Web服务器被用于创建应用服务器的前端,也就是,它公开了一组网页,允许用户与应用服务器中的业务规则进行交互。


89

Web服务器

运行python -m 'SimpleHTTPServer',并访问http://localhost:8080。你看到的是Web服务器在工作。该服务器简单地通过HTTP协议提供存储在计算机上的文件。关键点在于所有这些都是在HTTP协议之上完成的。还存在FTP服务器等,它们完全相同(提供存储的文件),但是使用不同的协议。

应用服务器

假设我们有一个像下面这样的小型应用程序(来自Flask)。

@app.route('/')
def homepage():
    return '<html>My homepage</html>'

@app.route('/about')
def about():
    return '<html>My name is John</html>'
这个小例子程序将URL路径“/”映射到函数“homepage()”,并将“/about”映射到函数“about()”。
要运行此代码,我们需要一个应用程序服务器(例如Gunicorn),它是一个可以侦听来自客户端的请求并使用我们的代码返回动态内容的程序或模块。在这个例子中,我们只是返回一些很糟糕的HTML。
那么其他人谈论的业务逻辑是什么?嗯,由于URL映射到代码库中的某个特定位置,我们假设展示了关于我们程序如何工作的某些逻辑。
回顾一下: Web服务器 - 提供存储在某个地方的文件(最常见的是.css、.html、.js)。常见的web服务器是Apache、Nginx,甚至还有Python的SimpleHTTPServer。 应用程序服务器 - 服务于实时生成的文件。实际上,大多数Web服务器都具有某种插件功能,甚至带有内置功能来执行此操作。也存在一些严格的应用程序服务器,例如Gunicorn(Python)、Unicorn(Ruby)、uWSGI(Python)等。 请注意,您实际上可以使用应用程序服务器的代码构建Web服务器。在开发过程中,在您不想在计算机上运行无数不同的服务器时,可以这样做。

这是最好的、最简洁的答案。我在想一个 Web 服务器是否可以被认为是应用服务器的子集。现在我认为它就像一个 getter 方法,而应用服务器就像一个 factory 方法(其中 URL 是一个构造函数参数:D)。 - user7917402
10
终于,感谢提供Python的视角。虽然这个话题看起来与编程语言无关,但实际上并非如此。从未使用过EJB的人可能不会清楚地理解面向Java的答案。 - Vikas
谢谢。"要运行此代码,我们需要一个应用服务器",您能说明一下运行Flask程序所需的应用服务器是什么吗? - Tim
2
@aderchox 这将把Apache转变为应用服务器。所以我不确定你说它不准确是什么意思。Nginx可以通过Lua进行扩展,因此您甚至可以让它冲咖啡。这是否意味着Nginx也是一台咖啡机? - Pithikos
@变量,服务器本身并不“知道”任何东西。它只是接收请求,如果它可以处理(正确的权限、有效的URL等),那么它就会处理。整个基础架构的设置必须被配置为这样,以便正确的服务器获取正确的请求。这就是中间件、路由、DevOps等的作用所在。这取决于你和/或DevOps。 - Pithikos
显示剩余4条评论

72

正如Rutesh和jmservera提到的那样,这种区分是模糊的。历史上,它们是不同的,但在90年代,这两个之前明显不同的类别融合了特性并有效地合并了。此时最好想象“应用服务器”产品类别是“Web服务器”类别的严格超集。

简要历史。在Mosaic浏览器和超链接内容的早期,出现了一种被称为“Web服务器”的东西,它通过HTTP提供Web页面内容和图像。大多数内容都是静态的,而HTTP 1.0协议只是一种将文件传输到各处的方式。很快,“Web服务器”类别就发展成为包括CGI功能的东西——每次Web请求启动一个进程以生成动态内容。HTTP也变得更加成熟,产品变得更加复杂,具备缓存、安全和管理功能。随着技术的成熟,我们从Kiva和NetDynamics得到了公司特定的基于Java的服务器端技术,最终合并为JSP。我认为微软在1996年将ASP添加到Windows NT 4.0中。静态Web服务器学会了一些新技巧,因此对于许多情况来说,它是一个有效的“应用服务器”。

在一个平行的类别中,应用服务器已经发展并存在了很长时间。公司为类Unix的Tuxedo、TopEnd和Encina提供了产品,这些产品在哲学上源自于像IMS和CICS这样的主机应用程序管理和监视环境。微软的产品是Microsoft Transaction Server(MTS),后来演变成COM+。大多数这些产品规定了“封闭”的产品特定通信协议,以将“肥厚”的客户端连接到服务器。(对于Encina,通信协议是DCE RPC;对于MTS,它是DCOM等)。在1995/96年,这些传统的应用服务器产品开始通过网关嵌入基本的HTTP通信能力。然后这些界线开始变得模糊。

Web服务器越来越成熟,可以处理更高的负载、更多的并发和更好的功能。应用服务器提供了越来越多的基于HTTP的通信功能。

目前,"应用服务器"和"Web服务器"之间的界限变得模糊不清。但是人们继续以不同的方式使用这些术语,以强调各自的特点。当有人说"Web服务器"时,通常会想到面向HTTP、Web UI的应用程序。而当有人说"应用服务器"时,您可能会想到"更重的负载、企业级功能、事务和队列、多通道通信(HTTP+更多)"。但实际上,同一产品经常为两组工作负载需求提供服务。

  • IBM的"应用服务器"WebSphere具有自己捆绑的Web服务器。
  • 另一个传统的应用服务器WebLogic也是如此。
  • Windows作为微软的应用服务器(除了作为其文件和打印服务器、媒体服务器等),还捆绑了IIS。

非常清晰的回答。但您能否更详细地阐述一下允许Web服务器作为应用程序服务器运行的“新技巧”? - Quazi Irfan
3
"new tricks" 意味着执行服务器端逻辑,类似于 ASP 或其他脚本逻辑。最初的“Web 服务器”只返回文件系统中的静态内容。现在我们已经走了很长的路程。 - Cheeso
我经常听到“企业级功能”的说法。您能详细解释一下吗? - Chaos

37

正如许多人之前所说,Web服务器处理HTTP请求,而应用服务器处理分布式组件的请求。因此,也许最容易理解两个产品之间的区别是对它们提供的编程环境进行比较。

Web服务器 -> 编程环境

IIS:ASP(.NET)

Tomcat:Servlet

Jetty:Servlet

Apache:Php、CGI

应用服务器 -> 编程环境

MTS:COM+

WAS:EJB

JBoss:EJB

WebLogic应用服务器:EJB

重要的区别在于应用服务器支持一些分布式组件技术,提供远程调用和分布式事务等功能,例如Java世界中的EJB或Microsoft平台上的COM+。HTTP服务器通常支持一些更简单的编程环境,通常是脚本语言,例如Microsoft的ASP(.NET)或基于Servlet的JSP和许多其他语言,以及Apache的PHP和CGI。

其他功能,如负载平衡、集群、会话故障转移、连接池等曾经属于应用服务器领域,现在也可以直接或通过某些第三方产品在Web服务器上实现。

最后值得注意的是,像Spring框架这样的“轻量级容器”通常以更简单的方式补充应用服务器的作用,而无需应用服务器基础设施。由于应用程序中的分布方面正在从分布式组件向服务范例和SOA架构转移,传统的应用程序服务器留下的空间越来越少。


你列出的任何应用服务器都可以像Apache HTTP一样用作HTTP Web服务器吗? - LearningMath

28
简而言之,
Web服务器是一种通过HTTP请求向用户提供静态网页的服务器。
应用服务器是一种为系统托管业务逻辑的服务器。
它通常托管长时间运行/批处理过程和/或不面向人类消费 (REST/JSON服务、SOAP、RPC等) 的互操作服务。

3
“host's the business logic”这个术语是什么意思?它是如何执行的? - TwiggedToday
业务逻辑是否通过Web服务向客户端公开? - TwiggedToday
它可以通过 Web 服务提供,也可以通过任何其他接口(TCP、MQ、共享的平面文件(我不建议使用最后一种))提供。 - C. Ross
这可能会让人产生误解。应用服务器并不托管任何内容。您的代码托管业务逻辑,应用服务器作为连接用户请求的Web页面和业务逻辑之间的粘合剂。 - Pithikos
2
谁在到处带来这些令人困惑的术语,到处都是含糊不清的定义? - pasignature

26

Web服务器和应用服务器的主要区别在于,Web服务器用于服务于静态页面(例如HTML和CSS),而应用服务器则通过执行服务器端代码(例如JSP、Servlet或EJB)来生成动态内容。

我应该使用哪一个?
一旦你了解了Web服务器、应用服务器和Web容器之间的区别,就很容易确定何时使用它们。 如果你正在提供静态网页,那么你需要像Apache HTTPD这样的Web服务器。如果你有一个只使用JSP和Servlet来生成动态内容的Java应用程序,则需要像Tomcat或Jetty这样的Web容器。然而,如果你有使用EJB、分布式事务、消息和其他高级功能的Java EE应用程序,则需要像JBoss、WebSphere或Oracle的WebLogic这样的完整的应用服务器

Web容器是Web服务器的一部分,而Web服务器则是应用服务器的一部分。

Application Server

Web服务器由Web容器组成,而应用服务器由Web容器和EJB容器组成。



20
一个 Web 服务器专门处理 HTTP/HTTPS 请求,使用 HTTP/HTTPS 协议向 Web 提供内容。
应用程序服务器通过任意数量的协议(可能包括 HTTP)向应用程序提供业务逻辑。应用程序可以像调用对象的方法一样使用此逻辑。在大多数情况下,服务器通过组件 API 公开此业务逻辑,例如在 Java EE 应用程序服务器上找到的 EJB(Enterprise JavaBean)组件模型。
主要问题是 Web 服务器通过 http 协议暴露了所有内容,而应用程序服务器不受限于此。因此,应用程序服务器提供比 Web 服务器更多的服务,通常包括:
- (专有或非专有的)API - 负载均衡、故障转移等 - 对象生命周期管理 - 状态管理(会话) - 资源管理(例如连接池到数据库)
大多数应用程序服务器将 Web 服务器作为其不可分割的一部分,这意味着应用程序服务器可以执行 Web 服务器所能执行的任何操作。此外,应用程序服务器还具有支持应用程序级服务的组件和特性,例如连接池、对象池、事务支持、消息服务等。
应用程序服务器可以(但并不总是)在 Web 服务器上运行以执行程序逻辑,然后 Web 服务器可以传递结果。这是 Web 服务器/应用程序服务器方案的一个示例。在 Microsoft 的世界中,Internet Information Server(IIS)与 SharePoint 服务器之间存在类似的关系。IIS 是 Web 服务器;SharePoint 是应用程序服务器。SharePoint 位于 IIS 之上,执行特定的逻辑,并通过 IIS 提供结果。
在 Java 的世界中,Apache 和 Tomcat 就有类似的情况。
由于 Web 服务器非常适合静态内容,而应用程序服务器非常适合动态内容,因此大多数生产环境将 Web 服务器作为反向代理服务器,将服务请求分发到应用程序服务器。这意味着在服务页面请求时,Web 服务器提供解释请求的静态内容。使用某种过滤技术(通常是所请求资源的扩展名),Web 服务器识别动态内容请求并将其透明地转发到应用程序服务器。
一个这样的配置例子是 Apache HTTP Server 和 BEA WebLogic Server。Apache HTTP Server 是 Web 服务器,BEA WebLogic 是应用程序服务器。在某些情况下,服务器紧密集成,例如 IIS 和 .NET Runtime。IIS 是 Web 服务器,当配备了 .NET 运行环境时,IIS 能够提供应用程序服务。
Web Server                               Programming Environment
Apache                                   PHP, CGI
IIS (Internet Information Server)        ASP (.NET)
Tomcat                                   Servlet
Jetty                                    Servlet

Application Server                       Programming Environment
WAS (IBM's WebSphere Application Server) EJB
WebLogic Application Server (Oracle's)   EJB
JBoss AS                                 EJB
MTS                                      COM+

3
这段文字中提到了其他的东西,但是很多内容在我看来都像是剽窃。比如结尾处的列表,仿佛是从丹的帖子中复制过来的。还有“...反向代理到应用服务器...”这一部分,以及最后使用HTTP服务器和BEA WebLogic服务器作为例子的部分,几乎与Rutesh Makhijani所写的内容相同。 - brat

14
这两者之间的边界变得越来越模糊。
应用服务器向客户端公开业务逻辑。这意味着应用服务器包括一组方法(不仅限于此,甚至可以是允许多个人在其上运行软件的网络计算机)来执行业务逻辑。因此,它将简单地输出所需结果,而不是HTML内容。(类似于方法调用)。因此,它不严格基于HTTP。
但是Web服务器将HTML内容传递给Web浏览器(严格基于HTTP)。Web服务器只能处理静态Web资源,但是服务器端脚本的出现也使Web服务器能够处理动态内容。Web服务器接收请求并将其指向相关脚本(PHP、JSP、CGI脚本等)以创建要发送到客户端的HTML内容。一旦接收到内容,Web服务器将向客户端发送HTML页面。
然而,现在这两个服务器一起使用。 Web服务器接收请求,然后调用脚本创建HTML内容。然后,脚本将再次调用应用服务器逻辑(例如检索交易详情)以填充HTML内容。
因此,这两个服务器都被有效地使用。
因此,我们可以有把握地说,现在大多数情况下,Web服务器被用作应用程序服务器的子集。但理论上并非如此。
我已经阅读了许多关于这个话题的文章,发现this文章非常实用。

理论上 -> 理论上? - Palec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接