2012-11-14 67 views
17

Web应用程序框架,如西纳特拉(红宝石),玩(斯卡拉),电梯(斯卡拉)产生一个网络服务器侦听到特定端口。为什么要在框架Web服务器前使用http服务器?

我知道有一些原因,如安全性,集群和,在某些情况下,性能,这可能导致在我的Web应用程序之一的前面使用的Apache Web服务器。

你有没有从你的经验,这方面的任何原因?

+0

你想要什么样的细节? –

+0

谢谢@DaveNewton。我改变了这个问题。我只需要已经完成的人的理由。 – juanpavergara

+0

另请参见http://stackoverflow.com/q/2939393/152948 – hobbs

回答

41
  • 任何Web应用程序的一部分都是完全标准化和商品化的功能。像nginx或apache这样成熟的web服务器可以做以下事情。他们可以以一种非常可能更正确,更高效,更稳定,更安全,更系统管理员更熟悉的方式执行以下任务,并且比您在应用程序服务器中可以重写的任何内容更容易配置。
    • 提供静态文件,如HTML,图像,CSS,JavaScript的,字体等
    • 处理虚拟主机(多个域上的单个IP地址)
    • URL重写
    • 主机名重写/重定向
    • TLS终止(感谢@ emt14)
    • 压缩(感谢@JacobusR)
  • 单独的Web服务器提供的能力为s ERVE了“停机维护”页面,而应用程序服务器重新启动或低于崩溃
  • 反向代理可以提供负载平衡和容错功能为你的应用程序框架
  • Web服务器都内置了和测试机制,结合特权端口( 1024)作为root用户,然后作为非特权用户执行。大多数Web应用程序框架默认都不会这样做。
  • 成熟的Web服务器战斗硬化和稳定。稳定,我的意思是,他们几乎从不崩溃。你的网络应用程序几乎可以肯定不太稳定。这使您至少能够向用户提供一个漂亮的错误页面,说您的应用程序已关闭,而不是Web浏览器只显示通用的“无法连接”错误。

以防万一你想从艾萨克Schluetter在Airbnb tech talk on January 30, 2013半官方的答案约40分钟他解决了节点是否稳定的问题,足以保证直接为互联网提供连接服务。他的回答基本上是“是”,没关系。所以,你可以做到这一点,你可能会从一个稳定和安全的角度罚款(假设你使用集群来处理应用程序服务器进程的意外终止),但高于当前运行的现实情况详见是,仍然几乎每个人都运行节点在单独的Web服务器或反向代理/缓存之后。

+0

像nginx这样的服务器在处理非常高的并发负载方面也非常胜任,这是通过使用处理器模型完成的,该模型允许每个线程有很多并发请求。这是服务于静态内容的远高于吞吐量的原因的一部分。这可以让您的应用服务器专注于自己的工作。 –

+0

确实。这就是我所说的“更高效”,但是从多方面来看,它们通常会比应用程序框架更适合:并发性,延迟和资源利用率。有时候,您的Web框架可能会针对这些指标中的一个或多个指标提供可比较的性能,但是当考虑全局时,仍然有充分的理由将您的应用程序框架置于专用Web服务器之后。 –

2

常常框架做你需要的一切,但有时候,最重要的是增加了一层可以给你喜欢的压缩,安全性,会话管理,负载平衡等。还有看似免费的功能,增加了网络服务器也可以引入安全问题,例如,您的Web服务器安全性可能比Lift本身更容易受到攻击。此外,一些Web框架具有极高的可扩展性,甚至可能会受到选择不当的Web服务器的阻碍。总之,如果你需要网络服务器的功能,而不是框架提供的功能,那么Web服务器可能是一个非常好的选择,但请记住,正确配置和定期更新是安全的补丁等

如果,例如,你只需要加密,或压缩,那么你会发现,添加正确的库或插件到您的架构可以做到这一点(和只)

2

我将添加:

  • ssl处理
  • 对于一些服务器,如Apache许多模块(即 ntml/Kerberos身份验证)
  • 对于某些与您的应用程序相比,Web服务器要好得多的服务,比如静态服务。
0

使用代理http服务器,框架不需要保持打开http连接以提供计算的内容,然后可以开始提供其他请求。它充当缓冲区。

0

这是一个重新发明车轮的问题。大多数框架将为您提供开发环境,但对于生产来说,使用能够处理生产过程中出现的所有问题的商业/开源项目通常是一种很好的做法。

构建框架的人将有框架专注于构建服务器的人正在做同样的(完善)。