Apache HTTP服务器和Apache Tomcat的区别是什么?

685

Apache HTTP Server和Apache Tomcat在功能方面有何不同?

我知道Tomcat是用Java编写的,而HTTP服务器则是用C编写的,但除此之外,我并不真正知道它们如何区分。它们是否具有不同的功能?


12
我已在我的博客中添加了一份摘要,或许对某些人有帮助:http://www.tugay.biz/2014/11/what-is-tomcat-is-it-web-server-what.html。 - Koray Tugay
49
我在想OP具体在问什么,不明白为什么它会被关闭。幸运的是有回答。 - Florian F
7
“Apache Web Server”和“Apache Tomcat”是两种针对不同目的进行优化的工具。如果我们无法通过事实和专业知识来区分它们的用例,那么我们就会陷入困境。关闭“有争议”的问题的做法已经过度了。也许版主需要更多信息,而不是过多发表个人意见。正如@FlorianF所说,至少现在有答案了。 - NeilG
5
根据点赞数,这个问题不应该被关闭,而应该被锁定,因为它实际上是一个非常好的问题,有很多有用的回答。 - simbro
3
这个问题上的“已关闭”通知称需要回答具有客观内容,但却预计这个问题将会产生主观回答 - 大多数回答似乎包含客观内容(特别是得到更高票的回答),而非主观的 - 因此,这个问题应该被重新开放。担心主观性的担忧从未真正发生过,我不同意这个问题本身存在主观风险的说法。 - cellepo
8个回答

504

Apache Tomcat用于部署Java Servlets和JSPs。在Java项目中,您可以构建WAR(Web ARchive)文件,然后将其放入Tomcat的部署目录中。

基本上,Apache是一个HTTP服务器,提供HTTP服务。而Tomcat则是一个Servlet和JSP服务器,提供Java技术支持。

Tomcat包括Catalina,它是一个Servlet容器。最终,Servlet是一个Java类。JSP文件(类似于PHP和早期的ASP文件)会被生成为Java代码(HttpServlet),然后由服务器编译成.class文件,并由Java虚拟机执行。


56
“Apache is […] serving HTTP” 的意思是什么?Tomcat 不也可以提供(超文本传输协议)HTTP服务吗?为什么 Tomcat 不能简单作为“mod_java” Apache 模块呢?能否解释一下? - Peterino
32
Tomcat是一个Servlet容器。最终,Servlet是一个Java类。JSP文件(类似于PHP或ASP文件)被生成为Java代码(HttpServlet),然后由服务器编译为.class文件,并由Java虚拟机执行。此外,这个论坛很好地解释了Apache HTTPD和Tomcat之间的区别:http://www.coderanch.com/t/85182/Tomcat/difference-between-Apache-HTTP-server - Peterino
17
Tomcat确实带有一个功能强大的Web服务器。Tomcat是Servlet/JSP容器,并且还提供了一个Web服务器。Tomcat的Web服务器非常出色,能够处理大多数小型和中型网站的需求。支持Java NIO和64位内存,甚至一些更大规模的网站也可以通过Tomcat的Catalina模块得到良好的服务。由于各种原因,有些人选择忽略Catalina,而是在Apache httpd Web服务器产品后面使用Tomcat的Servlet功能。 - Basil Bourque
26
更正我的评论:Coyote是Tomcat负责Web服务的模块。Catalina是处理Servlets的模块。Jasper是处理JSP的模块。 - Basil Bourque
19
@KorayTugay 是的。Tomcat = (Web服务器+Servlet容器+JSP环境)。当您运行Tomcat的 startup.sh 脚本时,默认情况下Web服务器会启动,并监听端口8080以获取传入连接(HTTP调用)。Tomcat是纯Java编写的,具有自己的Web服务器实现(Coyote)。相比之下, Apache HTTP Server (AHS) 有一个完全独立的Web服务器实现,使用本机C/C++代码。 AHS非常灵活和强大,但通常会过度使用。 Tomcat自己的Web服务器工作得非常好。只有在确实需要时才使用AHS。 - Basil Bourque
显示剩余11条评论

125
除了以上优秀的回答,我认为应该提到Tomcat内置了自己的HTTP服务器,完全可以用于提供静态内容。根据您的Java虚拟机配置,它实际上可以比传统连接器(如Apache中的mod_proxy和mod_jk)更快地处理请求。
也就是说,一个完全优化的Tomcat服务器应该可以快速地提供静态文件,如果您除了静态内容还有Java Servlets、JSP和ColdFusion文件,那么您可能会发现Tomcat本身已经做得非常好了。

3
没错。很多人仍然在Tomcat之外使用额外的Apache设置,但在大多数情况下这是不必要的。 - Marco Schoolenberg
8
少数其他服务器无法支持的 Apache HTTP 服务器最强大的部分是能够在应用程序看到请求之前重新路由和重写请求,即通过 mod_rewrite 引擎和条件环境注入。mod_proxy 提供了基本的负载均衡功能(与 mod_jk结合使用可以在负载平衡的Tomcat实例之间提供基本的粘性会话/共享状态)。 - cowbert

89
  1. Apache是一个通用的HTTP服务器,它支持许多Tomcat不支持的高级选项。
  2. 虽然Tomcat可以用作通用的HTTP服务器,但您也可以设置Apache和Tomcat一起工作,使Apache提供静态内容并将动态内容的请求转发到Tomcat。

难道所有的网页最终都是静态的吗?我的理解是,Tomcat会动态地生成“一个”静态内容,然后Apache将提供此内容。因此,Tomcat实际上永远不会提供动态内容或任何其他内容,它只会在需要时生成它。 - Koray Tugay
14
@KorayTugay,你混淆了术语。“按需生成”正是“动态”的意思,与“静态”完全相反。Apache HTTP服务器的主要目的是提供静态内容,而Servlet技术的主要目的是实时生成内容(动态内容)。 - Basil Bourque
1
@BasilBourque,我对Tomcat实际上提供内容感到困惑。当与Apache Http Server一起使用时,它只会生成内容,而不会提供内容。也许你是对的,而我只是感到困惑,但对我来说,当它们一起使用时,Apache提供服务,Tomcat在需要时生成静态内容。如果没有使用Apache,则Tomcat中的Coyote将提供服务,而Catalina和Jesper则会生成动态内容。 - Koray Tugay
3
@KorayTugay 是的,你最后的评论是正确的。如果使用 Apache HTTP Server + Tomcat,那么 web 浏览器只能“看到” AWS,不知道 Tomcat 在幕后工作。AWS 是 Web 浏览器客户端和 Tomcat 之间的中间人。如果只使用 Tomcat,则 Tomcat 中的 Coyote 模块将取代 AWS 来处理来自 Web 浏览器客户端的请求。我建议选择后者(仅使用 Tomcat),除非你知道你有非常特殊的需求,最好使用 AWS 处理。 - Basil Bourque
@BasilBourque 我明白了,谢谢你的解释。 - Koray Tugay
显示剩余5条评论

31

Tomcat主要是一个应用服务器,它会为您的服务器上的自定义Java Servlets或JSP文件提供请求服务。在我的经验中,通常与Apache HTTP服务器配合使用。使用它手动处理传入的请求。

HTTP服务器本身最适合提供静态内容... 如html文件、图像等。


11
我对 Tomcat is primarily an application server 这个说法表示怀疑。 - Rachel
7
Tomcat主要设计用作应用服务器,但也可以提供静态内容服务。 - Scalable
5
是的,Tomcat主要是一个应用服务器,如果这个术语的意思是指Servlet容器生成动态内容并传递给Web浏览器的话。作为最早的Servlet容器之一,这就是Tomcat存在的原因。 - Basil Bourque
1
Tomcat不是一个应用服务器,它是一个Web服务器。http://javajee.com/web-server-web-container-and-application-server - Prateek Mishra
1
基于您提供的链接,您关于Tomcat是一个Web服务器的说法是不正确的;它(主要)是一个Web容器,也称为Servlet容器。 - skomisa

22

Apache服务器是一种可以服务于任何简单HTTP请求的HTTP服务器,而Tomcat服务器实际上是一个可以服务于Java Servlet请求的Servlet容器。

Web服务器[Apache]处理Web客户端(Web浏览器)请求并将其转发到Servlet容器[Tomcat],容器处理请求并发送响应,Web服务器将响应转发给Web客户端[浏览器]。

此外,您可以通过以下链接获得更多澄清:

https://sites.google.com/site/sureshdevang/servlet-architecture

还可以查看此答案以进行进一步研究:

https://softwareengineering.stackexchange.com/a/221092


请访问以下链接以了解Servlet架构的更多信息:https://sites.google.com/site/sureshdevang/servlet-architecture。这将为您提供更好的视角。 - Akitha_MJ

15

如果你正在使用Java技术(Servlet/JSP)制作Web应用程序,那么你可能会使用Apache Tomcat。 然而,如果你正在使用其他技术,如Perl、PHP或Ruby,最好(更容易)使用Apache HTTP服务器。


11
这个答案对我来说毫无意义。第一句话是错误的,因为除了Tomcat之外还有许多其他Servlet/JSP容器,其中一些非常流行,例如Jetty、JBoss/Wildfly、Glassfish、WebSphere等等。虽然Tomcat很受欢迎,但它并不占据主导地位,市场份额只是少数。至于第二句话,Tomcat通常被用作Apache HTTP Server后面的Servlet容器。而PHP等通常与其他Web服务器一起使用,例如Nginx、Lighttpd等。 - Basil Bourque
公平地说,我们专门使用Tomcat来提供我们的服务器端软件(因为它全部基于Java),但由于Apache的高级功能,我们在其下运行此软件。 - George c
Servlets和JSP也可以用于动态内容吗?因为Tomcat和Apache HTTP服务器能够提供静态内容而不是动态内容。我对此了解很少@BasilBourque - Prateek Gautam
1
@Matuagkeetarp 是的,Servlet和JSP用于创建动态内容。请阅读Wikipedia页面教程规范。Apache Tomcat是运行您编写的Servlets/JSPs的几个可用产品之一。Eclipse Jetty是Tomcat的直接竞争对手,两者都很受欢迎且成功。 - Basil Bourque

4

Apache是一个HTTP Web服务器,而Tomcat也是一个Servlet和JSP的Web服务器。此外,在实时环境中,Apache优于Apache Tomcat。


21
这个问题很古老,你的回答似乎是重复了先前已经发布的答案。我们欢迎回答,但新的回答应该有助于增加对话内容。 - GargantuChet

-1

Apache是一个HTTP Web服务器,用作HTTP。

Apache Tomcat是一个Java Servlet容器。它具有与Web服务器相同的功能,但定制为执行Java Servlet和JSP页面。


1
是的,答案有点令人困惑,就像@Basil Bourque上面所说的“Coyote是Tomcat中负责Web服务的模块,Catalina是执行Servlets的模块,而Jasper是处理JSP的模块”。现在它清楚地解释了“TOMCAT FEATURES Same as web server customized to execute java servlet and JSP pages!!!!”的含义。 - Dev

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