当Apache已经可以拥有JVM时为啥要发明Tomcat [关闭]

Posted

技术标签:

【中文标题】当Apache已经可以拥有JVM时为啥要发明Tomcat [关闭]【英文标题】:Why invent Tomcat when Apache can already have JVM [closed]当Apache已经可以拥有JVM时为什么要发明Tomcat [关闭] 【发布时间】:2015-01-13 05:45:41 【问题描述】:

我之前使用过 Apache Web 服务器,使用 php、Ruby 并提供静态 javascript/html 页面。

我对 Tomcat 感到困惑的一件事基本上是为什么首先存在 Tomcat,而不是使用安装了 JVM 的 Apache? 为什么所有这些流行的语言Java需要它自己的专门容器,即Tomcat吗?

如果想使用 PHP 来提供内容,只需在 Apache 服务器上安装 PHP,然后当用户访问 mysite.com/mypage.php 时就会发生这种情况:

    Apache服务器获取对应文件mypage.php 看到PHP,使用PHP解释器处理页面 返回结果

使用 Java 时为什么不一样?

在我看来它应该是这样的:只需在 Apache 服务器上安装 Java 和 JVM,然后当用户访问 mysite.com/mypage 时就会发生这种情况:

    Apache服务器获取对应文件 看到Java,使用JVM编译/处理页面 返回结果

是不是因为Java文件需要编译,每次请求都重新编译没有意义?那么为什么不将请求映射到正确的.class 文件呢?

对于那些对 Tomcat 有信心的人来说,这可能听起来很荒谬,但正如您所见,我很遗憾不明白。

【问题讨论】:

为什么存在如此多的事物,以致于大部分或完全复制另一事物? 你应该看看Apache和Tomcat的区别:***.com/questions/30632/… 真正的答案是存在 Java Servlet 规范,并且 something 需要实现该规范以允许基于 Java servlet 的 Web 应用程序运行。 Apache httpd 绝对不是这样做的正确位置。 PHP 是自托管的,而 Java 不直接提供这些服务。 PHP 和 Java(servlet)之间的比较不应该是“所有 PHP 需要的是磁盘上的脚本,而 Java 需要所有这些垃圾”,而是“PHP 包含所有这些垃圾,而 Tomcat 为 Java 提供了同样的垃圾”。 【参考方案1】:

Php 和 Java 是可以独立于 Apache 运行的开发平台。为了运行 PHP 脚本/应用程序,您首先需要安装 PHP 解释器,Java 也是如此,您必须安装一个作为 Java 文件/应用程序解释器的 JVM。

为了使用 Apache 运行 PHP 文件,您必须启用 mod_php 扩展,这基本上是一个允许从 Apache 调用 PHP 解释器并执行 php 脚本的程序。 J2EE 平台需要一个 Web 容器 (https://docs.oracle.com/javaee/5/tutorial/doc/bnabo.html) 来执行或运行 Web 应用程序。 Apache 可以使用模块与 J2EE Web 容器连接,通常您会使用 AJP 来允许 Apache 与 Tomcat 通信并执行 Java Servlet 或 JSP 页面。

您不需要 Apache 来运行 Java Web 应用程序,但是您必须使用 J2EE Web Container 来运行它们,因此从技术上讲 Tomcat 可以用作 Web 服务器,但不建议将其用于生产环境,因为 Apache 会更好特别是在提供静态内容时的性能。

【讨论】:

所以要在 Apache 上运行 PHP 你需要 mod_php,但是要在 Apache 上运行 Java 你需要一些 Web Container,Tomcat 是一个实现吗?我想我对 PHP 感到惊讶/困惑,它只是对解释器的调用,而对于 Java,它是一个单独的“容器”......如果我正确地遵循了这一点 是的,你是对的,这是因为 Web 容器是 J2EE 平台的一个组件,它具有与 PHP 不同的架构/方法。 (oracle.com/technetwork/java/javaee/overview/index.html) (en.wikipedia.org/wiki/Application_server) 所以显然我可以编写一个 Hello World 程序,并且它不需要按照 Java EE 规范的Container。但是,如果我想使用 Servlet,这是一种 Java EE 理念,那么它需要一个合适的 Java EE 容器——对吗?然后我认为 Servlet 是处理 Java 网络请求的事实标准——还是真正处理网络请求的容器? 实际上,在 Tomcat 之前就有 Apache/JServ 和 mod_jserv,它们允许 servlet 以非常类似于 PHP 的方式运行。【参考方案2】:

Tomcat 是一个 apache 项目。虽然理论上可以使用本机代码实现 JSP 和 Servlet 容器(如 Tomcat),但这不是最终选择的实现策略(我相信 Websphere 实际上确实遵循该实现模型)。不过tomcat确实有Connectors和引用

AJP

当使用单个服务器时,在 Tomcat 实例前面使用本机 Web 服务器时的性能在大多数情况下都比使用默认 HTTP 连接器的独立 Tomcat 差很多,即使大部分 Web 应用程序是由的静态文件。如果出于任何原因需要与本机 Web 服务器集成,AJP 连接器将提供比代理 HTTP 更快的性能。从 Tomcat 的角度来看,AJP 集群是最有效的。在其他方面,它在功能上等同于 HTTP 集群。

此 Tomcat 版本支持的本机连接器是:

JK 1.2.x with any of the supported servers
mod_proxy on Apache HTTP Server 2.x (included by default in Apache HTTP 
   Server 2.2), with AJP enabled

【讨论】:

为什么要提供这个JSP and Servlet container?为什么container 这么有必要?正如我在 OP 中提到的,除了 Web 服务器本身和语言的解释器(据我所知)之外,其他语言似乎没有任何 container 我不确定“必要”是否正确。如果我构建了一个 Java Web 存档文件 (.war),我可以将它放到 Tomcat、JBoss、Glassfish、Jetty 等……它会被提供。此外,在容器内部署时还有许多可用的强大功能。 @mmcrae 因为否则它不是 JSP 和 Servlet(s)。这些技术需要所谓的 Web 容器。

以上是关于当Apache已经可以拥有JVM时为啥要发明Tomcat [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

当 IIS 已经处理请求并发时,为啥要使用异步控制器?

当 JVM 执行 Java 应用程序时,操作系统的作用是啥?为啥我们需要操作系统?

GraphQL 和 Prisma:当它们已经是 Prisma 数据库模式的一部分时,为啥要在应用程序模式中重新定义类型?

当我们有常规数组时,为啥我们需要指向数组的指针?

当我们有客户端会话时,为啥我们需要 JWT?

为啥要对jvm做优化?