【问题标题】:Why should one use a http server in front of a framework web server?为什么要在框架 Web 服务器前使用 http 服务器?
【发布时间】:2012-11-02 13:32:03
【问题描述】:

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

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

根据您的经验,您对此有什么理由吗?

【问题讨论】:

标签: ruby scala playframework sinatra lift


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

如果您想在大约 40 分钟后通过 Airbnb tech talk on January 30, 2013 获得 Isaac Schluetter 的半官方答复,他将解决节点是否足够稳定和安全以提供直接到 Internet 的连接的问题。他的回答基本上是“是的”,这很好。所以你可以做到,从稳定性和安全性的角度来看,你可能会很好(假设你正在使用集群来处理应用服务器进程的意外终止),但正如上面所详述的,当前操作的现实是几乎每个人都运行节点在单独的 Web 服务器或反向代理/缓存后面。

【讨论】:

  • 像 nginx 这样的服务器也非常擅长处理非常高的并发负载,这是使用允许每个线程有很多并发请求的处理程序模型完成的。这是提供静态内容的吞吐量要高得多的部分原因。这让您的应用服务器只专注于它的工作。
  • 确实如此。这就是我所说的“更高效”的意思,但通常从许多角度来看,它们会比你的应用程序框架更适合:并发、延迟、资源利用率。有时,您的 Web 框架可能会提供与这些指标中的一个或多个相当的性能,但从大局考虑,仍然有充分的理由将您的应用程序框架置于专用 Web 服务器之后。
【解决方案2】:

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

构建框架的人将专注于框架,而构建服务器的人正在做同样的事情(完美)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      通常框架可以满足您的所有需求,但有时,在其上添加一个层可以为您提供看似免费的功能,如压缩、安全、会话管理、负载平衡等。不过,添加 Web 服务器也可能会引入安全问题,例如,您的 Web 服务器安全性可能比 Lift 本身更容易受到威胁。此外,一些 Web 框架具有极强的可扩展性,甚至可能会受到选择不当的 Web 服务器的阻碍。

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

      例如,如果您只需要加密或压缩,那么您可能会发现将正确的库或插件添加到您的框架中可能会做到这一点(并且仅此而已)

      【讨论】:

        【解决方案5】:

        我会补充:

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

        【讨论】:

          猜你喜欢
          • 2021-07-14
          • 2011-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-09
          • 2013-03-23
          • 2011-04-02
          • 2012-06-25
          相关资源
          最近更新 更多