22

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

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

根据你的经验,你有什么理由吗?

4

5 回答 5

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

以防万一您想在2013 年 1 月 30 日的 Airbnb 技术演讲中获得 Isaac Schluetter 的半官方回答,他在 40 分钟内解决了节点是否足够稳定和安全以直接连接到 Internet 的问题。他的回答基本上是“是的”,这很好。所以你可以这样做,从稳定性和安全性的角度来看你可能会很好(假设你正在使用集群来处理应用程序服务器进程的意外终止),但正如上面所详述的,当前操作的现实是几乎每个人都运行节点在单独的 Web 服务器或反向代理/缓存后面。

于 2012-11-14T03:08:58.403 回答
2

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

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

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

于 2012-11-14T05:19:05.803 回答
2

我要补充:

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

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

于 2012-11-15T06:19:10.347 回答
0

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

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

于 2013-01-04T08:04:20.197 回答