与php/ruby/etc + nginx相比,使用node.js+ node HTTP服务器有什么优势?


what's advantages on using node.js+ node http server over php/ruby/etc + nginx?

我看到很多文档说node.js http服务器的主要优势是事件io架构,但Nginx也有事件io,所以使用node.js + node http服务器比php或其他语言的Nginx有什么优势?

在任何答案的核心应该是声明'这取决于你想做什么'。例如,你可能试图…

  • 支持10k并发客户端在聊天室
  • 每月提供100万静态页面
  • 为3000个用户提供类似CMS的功能
  • 提供一个简单的博客类型的网站,由一个小企业使用
  • 支持写量大的系统,例如游戏,拥有数百万用户
  • 建立个人银行网站
  • 等。

人们普遍认为,应该选择正确的技术来解决手头的问题——任何关于将一种技术与另一种技术结合起来的优点的讨论,无论它们是否固有地处理事件IO,在没有上下文的情况下,在任何决策过程中都将具有有限的价值。

在你的技术栈决策中另一个非常有影响力的因素是可用于交付项目目标的技能和经验。

然而…

在使用了你所提到的所有技术之后,我将给你一些我们认为已经解决的问题的例子,以及为什么选择某些配置:

PHP + Nginx

是的,PHP是阻塞,但这并不妨碍Facebook和其他人使用它作为他们的核心web应用语言。在更传统的LAMP堆栈中,A是Apache,您有一个众所周知的长期存在的问题,在高流量条件下,您可能已经在入站到Apache的web请求和到数据库的连接之间创建了1对1的相关性。如果您希望为超过1000个并发客户端提供服务,而您的数据库有1000个连接限制,我估计您会遇到困难。

这种资源匮乏给超负荷的用户带来了破坏性的体验。

在这种情况下,Nginx可以给你更多的钱,因为事件IO解除了web请求和出站PHP数据库连接之间的相关性。有大量的文献可以证实这一点。请记住,这不是魔法——这是你配置NGinx和PHP的方式——你可以很容易地通过设置默认值来吊死自己。

假设经过深思熟虑的配置已经到位,NGinx的事件IO具有缓冲请求的净效果,以数据库可以处理的速度将它们分发给PHP。

PHP应用广泛使用像Memcached这样的缓存来进一步支持读重系统中的高容量。

Node.js(纯HTTP)

我们选择Node.js作为它支持的生产解决方案的原因是

  • 它不是关键任务(Node.js是新的,因此你不会想在它上面运行你的银行系统)
  • 我们想要一些轻量级的
  • 我们想要学习和实验-通常这个标准在许多业务系统中是不允许的

Node的新颖性和它的事件IO编程概念的微妙之处意味着我们破坏了很多次,并且与我们坚持使用PHP相比,我们花了更长的时间来得到最终的解决方案。

web应用的框架还处于起步阶段

  • Express.js
  • Socketstream
  • Backbone.js
  • 也许别人……

考虑到他们都很年轻,他们还有很多工作要做。根据您想要实现的项目目标,它们可能会很好地为您服务,也可能会耗费您学习它们的时间和精力。

例如,在Express.js中,简单的事情,如处理HTTP缓存头,内容的GZIPing并不是完全标准的,所以如果这类事情是必要的,你将不得不开始定制解决方案或寻找其他地方。

与NGinx或Apache不同,Node.js安装或使用它构建的应用程序没有任何原生的东西可以确保它在运行级别启动。这意味着您必须找出一些解决方案来管理应用程序在重新启动和其他恢复时的自动启动,使用除Node.js之外的其他东西。(我们使用Monit)

Node.js + NGinx

当然,为什么不呢?NGinx更成熟,所以我们需要在将SSL连接外包给Node.js之前终止SSL连接,这就是我们所做的。额外的好处是,现在NGinx可以GZIP内容通过。

如果一个组件是非阻塞的,这是不够的。所有这些都必须是为了使整个过程不阻塞。如果只有一件事阻塞了,那么所有的事都阻塞了。

即使在Node.JS中,你的应用程序仍然可能阻塞,即使Node.JS本身没有阻塞:如果你阻塞文件系统或数据库访问(无论出于何种原因),它仍然会阻塞。


顺便说一句:如果有东西阻塞,并不意味着它不好。所以这不是支持或反对Node.JS的理由。对于某些事情,你确实需要非阻塞应用程序,你应该使用Node.JS,但对于大多数应用程序,PHP是更好的选择(由于更大的社区支持和集成)

PHP是阻塞的,而Node.JS不是。如果nginx的架构与node.js几乎相同,这并不重要,因为PHP仍然是阻塞的。

取决于你的应用:

关于node js的简短视频:link

让事情变得更好:

它使用javascript,使服务器端和客户端之间更好的代码重用。

Node Js本身是非阻塞的