在Web服务器上提供静态内容,在Tomcat中提供动态内容仍然是一个好的性能实践吗?

12
在旧版的Tomcat(如3.2)中,建议将静态内容放在Apache Web服务器中,将动态内容留给Tomcat本身处理。 在新版本的Tomcat文档中,即使在mod_jk配置教程中,也找不到这种做法的任何参考。 因此,我想知道,Tomcat现在是否仍然不适用于提供静态内容?如果我改变部署方案以分离静态和动态内容,是否会有性能提升?
3个回答

10

关于纯速度方面,建议阅读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连接器,该连接器使用与httpd相同的本地库(Apache Portable Runtime—APR)进行低级别I/O,因此可以实现与httpd类似的性能。在提供静态内容时,与httpd相比,使用Tomcat会略微增加一些开销,但是这些差异非常小,生产系统中不太可能注意到它们。

...

由Tomcat用户邮件列表上的常规参与者Christopher Schultz执行的性能测试使用了更广泛的文件大小范围,并提供了更好的结果。他测试的结果如下图所示。

alt text

这些结果更符合预期,但是有一些有趣的要点需要注意:

  • Apache httpd和Coyote APR/native显示类似的性能水平。
  • Coyote NIO与httpd和Coyote APR/native相差不远。
  • sendfile的实用性存在局限性。这可能是硬件限制,但值得进一步关注。我已将其添加到我的待办事项列表中。
  • 对于小文件大小(小于约10KiB),Tomcat中的静态文件缓存可以显著提高性能。
  • ...

    虽然静态内容的原始性能不是使用httpd的好理由,但有许多很好的原因为什么你可能想要使用httpd与Tomcat。最常见的原因是为两个或更多Tomcat实例提供负载平衡。httpd并不是唯一可以实现这一点的选项 - 可以使用硬件负载均衡器或其他反向代理 - 但它是系统管理员中的热门选择,因为他们中的许多人已经熟悉httpd。我将在未来的文章中写更多关于使用httpd作为负载平衡器的内容。

    ...

    这篇文章非常值得一读。

    话虽如此,在Tomcat之前使用Web服务器提供静态内容,显然会为动态内容释放更多的功率,因此这是我最喜欢的选项。


    3

    当你在选择Apache httpd和Tomcat之间时,不应该考虑速度。

    什么是JK(或AJP)?

    AJP是一种协议。它是HTTP协议的优化版本,允许像Apache这样的独立Web服务器与Tomcat通信。历史上,Apache在提供静态内容方面比Tomcat快得多。想法是尽可能让Apache提供静态内容,但将请求代理到Tomcat以获取与Tomcat相关的内容。

    并且

    速度。 Apache在提供静态内容方面比Tomcat更快。 但是,除非您有一个高流量的站点,否则此点毫无用处。 但在某些情况下,Tomcat可能比Apache httpd更快。 因此,请对您的站点进行基准测试。 当使用正确的连接器(启用sendFile的APR)时,Tomcat可以以httpd速度执行。在选择Apache httpd和Tomcat之间时,不应考虑速度因素


    资源:


    1
    也许可以通过在Tomcat中为所有“/static/*”内容添加一个max-age值的Cache-Control头来实现Servlet过滤器。因此,如果相同的客户端经常返回(Intranet),Tomcat就足够了,因为静态内容将保存在浏览器缓存中,并且与动态内容相比,很少向服务器请求。
    此外,对于静态内容使用Cache-Control可能是扩展网络带宽的好主意。
    (这只是我自己努力保持简单的经验)

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