node.js本身还是用于服务静态文件的nginx前端?


90

是否有任何更快的基准测试或比较:将nginx放在node前面,让它直接提供静态文件,还是仅使用node并使用它提供静态文件?

Nginx解决方案对我来说似乎更易于管理,有什么想法吗?


3
我要说的是,这还取决于您必须编写的配置和代码量,才能在一台服务器上使用另一台服务器。如果您不希望首次公开募股并且您的应用服务器已经配置好并且可以做您需要的一切,那么您可以坚持使用它直到不够用。
m33lky 2012年

Answers:


118

我不得不不同意这里的答案。尽管Node可以正常运行,但是如果配置正确,nginx肯定会更快。nginx以相似的模式(仅在需要时返回连接)以很小的内存占用量在C中高效实现。而且,它支持sendfile syscall来服务那些文件,这与服务文件时所获得的速度一样快,因为完成工作的是OS内核本身。

到目前为止,nginx已经成为事实上的前端服务器标准。您可以在以后提供静态文件,gzip,SSL甚至负载平衡时使用它来提高性能。

PS:这假设文件在请求时实际上是“静态的”,就像磁盘上的静态文件一样。


7
只是一点点注意:node.js也支持sendfile-但似乎您必须编写一些代码,请参见例如。blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo 2012年

除了提供静态内容之外,为什么Nginx的性能要比仅将主要Web服务器(Tomcat / Jetty / IIS等)公开在面向公众的域上好?
拉菲安2012年

1
如果对您的应用发出了请求,那么先通过nginx路由该请求就不会神奇地加快速度(在最好的情况下,nginx处理静态CSS和js,gzip和SSL时,它的速度会明显加快)。但是,nginx还是最好的软件负载平衡器之一,因此这可能很关键,因为大多数服务器在中等高负载下都是众所周知的。
m33lky 2012年

但是,您可以使用Node.js以异步方式对文件进行服务器处理。NGINX可以做到吗?
Dragos C.

1
@lwansbrough将这些基准置于表中。这个主题中至少有一个人自己做过实验。
m33lky 2015年

73

我快速地ab -n 10000 -c 100处理了一个静态的1406字节favicon.ico,比较了nginx,Express.js(静态中间件)和集群的Express.js。希望这可以帮助:

在此处输入图片说明

不幸的是,我无法测试1000个甚至10000个并发请求,因为在我的机器上,nginx会开始抛出错误。

编辑:如artvolk所建议,这是集群+ static中间件的结果(较慢):

在此处输入图片说明


谢谢,非常有帮助!您是否将以下中间件用于favicon:senchalabs.org/connect/favicon.html或仅用作静态文件?
artvolk

@artvolk一个收藏夹图标:)
gremo

3
您是否为测试设置了NODE_ENV = production?因为这将产生不可思议的差异,因为缓存static中间件将在生产中使用。
ruffrey

19
对于不说意大利语的人,x轴是请求数,而Y轴是服务文件所需的ms数。我必须在Google上进行翻译,因为我想确保自己没有读错数据。不过,这些数据令人难以置信,对我很有帮助,我非常感谢这里的基准测试。毕竟会坚持使用nginx
JL Griffin

1
是否设置了NODE_ENV =生产?
basickarl

11

我对@gremo的图表有不同的解释。在我看来,节点和Nginx都可以在相同数量的请求(9-10k之间)范围内扩展。确保nginx响应的延迟降低了恒定的20ms,但我认为用户不一定会意识到这种差异(如果您的应用程序构建良好)。在给定固定数量的机器的情况下,考虑到该节点首先要承担的大部分负载,在将节点机器转换为nginx之前,将需要相当多的负载。一个与之相对的观点是,您是否已经将一台机器专用于nginx来进行负载平衡。如果是这种情况,那么您也可以让它同时提供静态内容。


1
“确保nginx的响应延迟降低20ms不变,但我认为用户不一定会察觉到这种差异”?我非常希望你们不要这样做。有证据表明用户会感觉到1ms的差异!
纳文

4
需要引用
David Burrows

9

无论哪种方式,我都将设置Nginx来缓存静态文件 ...在那里您会看到巨大的不同。然后,无论您是否从节点提供服务,您的节点应用程序基本上都可以获得相同的性能和相同的负载减轻。

我个人不喜欢在大多数情况下我的Nginx前端提供静态资产的想法,

1)项目现在必须位于同一台机器上-或必须拆分为资产(在Nginx机器上)和Web应用程序(在多台机器上进行缩放)

2)Nginx配置现在必须维护静态资产的路径位置/当静态资产更改时重新加载。


0

这是一个棘手的问题。如果您编写了一个真正的轻量级节点服务器来仅提供静态文件,则它的性能可能会比nginx更好,但并不是那么简单。(这是一个比较基准,比较nodejs文件服务器和lighttpd-在提供静态文件时的性能与ngingx相似)。

服务静态文件的性能通常不仅仅取决于网络服务器。如果您希望获得最高的性能,则将使用CDN来提供文件,以减少最终用户的延迟,并从边缘缓存中受益。

如果您不必担心,那么在大多数情况下,node都可以提供静态文件。节点使自己适合异步代码,因为它是单线程的,任何阻塞的I / O都会阻塞整个过程,并降低应用程序性能,因此它也依赖于异步代码。您很有可能以非阻塞方式编写代码,但是如果您同步执行任何操作,则可能导致阻塞,这将降低其他客户端获取其静态文件的速度。一种简单的解决方案是不编写阻塞代码,但这有时是不可能的,或者您不能总是强制执行它。


9
都是胡说八道 这个问题是关于nginx而不是Apache。nginx和node都使用libev进行事件循环。Nginx将比节点快许多倍。其中之一没有VM的开销,并且专门为在文件系统上执行此操作而编写。
埃文·卡罗尔

1
libev是早期节点。Libuv已采用此角色以允许节点运行跨平台。
tsturzl 2014年

1
我看不到异步代码如何将其纳入其中。Node的性能将比Nginx差很多,这很可能是由于阻塞了I / O,当您有很多客户端要求您从磁盘读取文件时,I / O就会遇到。最佳实践是始终对静态资产使用Nginx,以便您的Node应用程序可以处理应用程序逻辑。我们可以谈谈理论上的场景,其中Node的性能会更好,但在现实世界中Nginx会赢得10英里的9倍
。– wgp

-11

我敢肯定,纯粹的node.js在很多方面都可以胜过Nginx。

所有人都说我必须留下NginX具有内置缓存,而node.js并未随工厂安装(您必须建立自己的文件缓存)。自定义文件缓存的性能非常简单,其性能优于nginx和市场上的任何其他服务器。

Nginx也在多个内核上运行。要充分利用Node的潜力,必须对节点服务器进行群集。如果您有兴趣知道如何操作,请下午。

您需要深入挖掘以实现节点性能,这是唯一的问题。一旦完成,是的...击败Nginx。


1
您需要提供一些事实,就像我想相信您在说的一样,但是需要基准,如果基于现实世界,那就太好了!但不是边缘情况
Stefan Rogin

5
有趣的是,该答案的事实与投票最多的所选答案一样多。我认为人们只喜欢前面的Web服务器,因为这是在[插入任何其他Web应用程序技术]中被教导的方法。这不是一个好答案,但可惜+1。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.