为什么要在框架web服务器之前使用http服务器



Web应用程序框架,如sinatra(ruby)、play(scala)、lift(scala

我知道有一些原因,比如安全性、集群,在某些情况下还有性能,这可能会导致我在web应用程序之前使用apache web服务器。

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

  • 任何web应用程序的一部分都是完全标准化和商品化的功能。像nginx或apache这样成熟的web服务器可以做以下事情。它们可以以一种可能比您在应用程序服务器中重写的任何东西都更正确、更高效、更稳定、更安全、更熟悉系统管理员、更易于配置的方式来完成以下任务。
    • 提供HTML、图像、CSS、javascript、字体等静态文件
    • 处理虚拟主机(单个IP地址上的多个域)
    • URL重写
    • 主机名重写/重定向
    • TLS终止(感谢@emt14)
    • 压缩(感谢@JacobusR)
  • 单独的web服务器提供了在应用程序服务器重新启动或崩溃时提供"停机维护"页面的功能
  • 反向代理可以为您的应用程序框架提供负载平衡和容错
  • Web服务器具有内置和经过测试的机制,可以以root身份绑定到特权端口(1024以下),然后以非特权用户身份执行。默认情况下,大多数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分钟后,他回答了node是否稳定的问题;足够安全,可以直接连接到互联网。他的回答基本上是"是的"——没关系。因此,您可以这样做,从稳定性和安全性的角度来看(假设您使用集群来处理应用程序服务器进程的意外终止),您可能会很好,但如上所述,当前操作的现实是,仍然几乎每个人都在单独的web服务器或反向代理/缓存后面运行节点。

我想添加:

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

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

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

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

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

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

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

最新更新