为什么要在框架Web服务器前使用http服务器?

Web应用程序框架(如sinatra(ruby),play(scala),lift(scala))生成一个侦听特定端口的Web服务器。

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

根据您的经验,您有任何理由吗?

  • 任何Web应用程序的一部分都是完全标准化和商品化的function。 像nginx或apache这样成熟的Web服务器可以执行以下操作。 他们可以以一种非常可能更正确,更高效,更稳定,更安全,更熟悉系统管理员的方式执行以下操作,并且比您在应用程序服务器中重写的任何内容都更容易配置。
    • 提供静态文件,如HTML,图像,CSS,JavaScript,字体等
    • 处理虚拟主机(单个IP地址上的多个域)
    • URL重写
    • 主机名重写/重定向
    • TLS终止(感谢@ emt14)
    • 压缩(感谢@JacobusR)
  • 单独的Web服务器可以在应用程序服务器重新启动或崩溃时提供“向下维护”页面
  • 反向代理可以为您的应用程序框架提供负载平衡和容错
  • Web服务器具有内置和测试机制,用于以root身份绑定到特权端口(低于1024),然后作为非特权用户执行。 大多数Web应用程序框架默认不执行此操作。
  • 成熟的Web服务器具有战斗力和稳定性。 稳定,我的意思是他们几乎从不崩溃。 您的Web应用程序几乎肯定不太稳定。 这使您能够至少向用户提供一个漂亮的错误页面,说明您的应用程序已关闭,而不是仅显示通用“无法连接”错误的Web浏览器。
    • 轶事案例:nginx处理攻击,否则DoS node.js: http : //blog.nodejs.org/2013/10/22/cve-2013-4450-http-server-pipeline-flood-dos/

如果你想在2013年1月30日的Airbnb技术讲座中得到Isaac Schluetter的半官方答复大约40分钟,他就会解决节点是否稳定且安全到足以直接连接互联网的问题。 他的回答基本上是“是”,这很好。 所以你可以做到这一点,你可能会从稳定性和安全性的角度来看很好(假设你正在使用集群来处理app服务器进程的意外终止),但如上所述,当前操作的实际情况仍然是几乎每个人都运行节点在单独的Web服务器或反向代理/缓存后面。

我想补充一下:

  • ssl处理
  • 对于一些服务器,比如apache很多模块(即ntml / kerberos身份validation)
  • 与应用程序相比,Web服务器在某些方面要好得多,比如提供静态服务。

通常,框架会执行您需要的所有操作,但有时,在其上添加一个层可以为您提供看似自由的function,如压缩,安全性,会话管理,负载平衡等。但是,添加Web服务器也可能会引入安全问题,例如,您的Web服务器安全性可能比Lift本身更容易受到损害。 此外,一些Web框架具有极高的可扩展性,甚至可能受到选择不当的Web服务器的阻碍。

总之,如果您需要Web服务器之类的function而不是框架提供的function,那么Web服务器可能是一个非常好的选择,但请记住,正确配置并定期更新安全补丁等是另一回事。

例如,如果您只需要加密或压缩,那么您可能会发现在框架中添加正确的库或插件可能就是这样(并且只有那个)

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

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

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

Interesting Posts