在 web 服务器中提供静态内容并在 tomcat 中提供动态内容仍然是一种良好的性能实践吗?
Posted
技术标签:
【中文标题】在 web 服务器中提供静态内容并在 tomcat 中提供动态内容仍然是一种良好的性能实践吗?【英文标题】:Serve static content in a web server and dynamic content in tomcat is still a good performance practice? 【发布时间】:2011-04-10 06:40:59 【问题描述】:在旧版本的 tomcat(如 3.2)中,您可以找到在 apache web 服务器中提供静态内容并将动态内容留给 tomcat 本身的建议。 在新版本的 tomcat 文档中,即使在 mod_jk 配置教程中,您也找不到任何关于这种做法的参考。 所以我想知道。
tomcat 不足以提供静态内容仍然是真的吗?如果我将部署架构更改为将静态和动态内容分开,性能会有所提高吗?
【问题讨论】:
【参考方案1】:关于纯速度,我建议阅读Myth or truth: One should always use Apache httpd in front of Apache Tomcat to improve performance? 博客文章。让我部分引用它:
简短的回答是,这是一个 神话。更长的答案是背面 在 Tomcat 3 时代,有一些 真相取决于 情况。然而,对于 目前使用的 Tomcat 版本(5.5.x 和 6.0.x) 那么就不需要 将 httpd 用于纯粹的性能 原因。 Tomcat 现在支持 本机/APR 连接器,它使用 相同的本地库(Apache Portable Runtime - APR) 作为 httpd 用于 低级 I/O,因此可以 实现与 httpd 类似的性能。 提供静态内容时,有 当 与 httpd 相比,使用 Tomcat 但 差异是如此之小 不太可能在 生产系统。
...
performance testing 执行 克里斯托弗·舒尔茨(Christopher Schultz),常客 Tomcat 用户邮件列表,使用了 更广泛的文件大小并提供 - 在我看来 - 更好的结果。这 他的测试结果显示在 下图。
这些结果更符合 与预期的一样,虽然有 有几个有趣的地方需要注意:
Apache httpd 和 Coyote APR/native 表现出相似的性能 级别。 Coyote NIO 并不落后于 httpd 和 Coyote APR/native。 sendfile 的用处似乎存在限制。这可能是一个 硬件限制但值得 进一步关注。我已将此添加到 我的待办事项清单。 对于小文件大小(小于 ~10KiB),静态文件缓存在 Tomcat 提供了一个显着的 性能提升。...
虽然静态的原始性能 内容可能不是一个很好的理由 使用httpd,有很多不错的 您可能想要使用的原因 httpd 与 Tomcat。最频繁的 原因是提供负载平衡到 两个或更多 Tomcat 实例。 httpd 这不是唯一的选择 - 硬件负载平衡器或其他 可以使用反向代理 - 但它 是系统中的热门选择 他们中的许多人都是管理员 已经熟悉httpd。生病 写更多关于使用 httpd 作为 负载均衡器在以后的文章中。
...
值得一读。
话虽如此,在 Tomcat 前使用 Web 服务器来提供静态内容显然会为动态内容释放更多的能量,因此是我最喜欢的选择。
【讨论】:
【参考方案2】:在 Apache httpd 和 Tomcat 之间进行选择时不应考虑速度。
什么是 JK(或 AJP)?
AJP 是一种有线协议。它是 HTTP 协议的优化版本,允许独立的 Web 服务器(如 Apache)与 Tomcat 通信。 从历史上看,Apache 在提供静态内容方面比 Tomcat 快得多。这个想法是尽可能让 Apache 提供静态内容,但将请求代理到 Tomcat 以获取 Tomcat 相关内容。
还有
速度。 Apache 在提供静态内容方面比 Tomcat 更快。但除非你有一个高流量的网站,否则这一点是没有用的。但在某些场景下,tomcat 可以比 Apache httpd 更快。因此,对您的网站进行基准测试。 当使用正确的连接器(启用了 sendFile 的 APR)时,Tomcat 可以以 httpd 速度运行。在 Apache httpd 和 Tomcat 之间进行选择时,不应考虑速度
资源:
Tomcat FAQ - Connectors【讨论】:
【参考方案3】:也许 Tomcat 中的 servlet 过滤器可以为所有“/static/*”内容添加一个带有 max-age 值的 Cache-Control 标头。因此,如果相同的客户端经常返回(Intranet),Tomcat 就足够了,因为静态内容将在浏览器缓存中,与动态内容相比,很少向服务器询问。
此外,静态内容的缓存控制对于扩展网络带宽可能是一个好主意。
(这只是我自己努力KISS的经验)
【讨论】:
以上是关于在 web 服务器中提供静态内容并在 tomcat 中提供动态内容仍然是一种良好的性能实践吗?的主要内容,如果未能解决你的问题,请参考以下文章