是否存在更快的基准测试或比较:将nginx放在节点前面并让它直接提供静态文件或仅使用节点并使用它来提供静态文件?
nginx解决方案对我来说似乎更容易管理,有什么想法吗?
答案 0 :(得分:112)
我不得不在这里不同意答案。虽然Node会很好,但正确配置后nginx肯定会更快。 nginx在C中有效实现,遵循类似的模式(仅在需要时返回连接),内存占用空间很小。此外,它支持sendfile系统调用来提供那些尽可能快地提供服务文件的文件,因为它是正在执行工作的操作系统内核本身。
到目前为止,nginx已成为事实上的标准作为前端服务器。您可以将其用于提供静态文件,gzip,SSL以及稍后进行负载平衡的性能。
P.S。:这假设文件真的是“静态的”,就像在请求时在磁盘上静止一样。
答案 1 :(得分:68)
我快速ab -n 10000 -c 100
提供静态1406字节favicon.ico
,比较nginx,Express.js(静态中间件)和集群Express.js。希望这会有所帮助:
不幸的是我无法测试1000甚至10000个并发请求,因为在我的机器上,nginx会开始抛出错误。
编辑:根据artvolk的建议,以下是群集+ static
中间件(较慢)的结果:
答案 2 :(得分:11)
我对@ gremo的图表有不同的解释。它看起来像节点和nginx规模相同的请求数(9-10k之间)。当然,nginx的响应延迟会持续20ms,但我并不认为用户必然会发现这种差异(如果您的应用程序构建良好)。 给定一定数量的机器,在将节点机器转换为nginx之前需要相当大的负载,因为该节点是首先出现大部分负载的地方。 与此相反的一个问题是,如果您已经将一台机器专用于nginx以实现负载平衡。如果是这种情况,那么您也可以使用它来提供静态内容。
答案 3 :(得分:9)
无论哪种方式,我都会设置Nginx来缓存静态文件 ......你会看到那里的巨大差异。然后,无论您是否从节点提供服务,您基本上都可以在节点应用上获得相同的性能和相同的负载。
我个人不喜欢在大多数情况下我的Nginx前端服务静态资产的想法,
1)项目现在必须在同一台机器上 - 或者必须分成资产(在nginx机器上)&网络应用程序(在多台计算机上进行扩展)
2)Nginx配置现在必须维护静态资产/重新加载时的路径位置。
答案 4 :(得分:1)
这是一个棘手的问题。如果你编写了一个非常轻量级的节点服务器来提供静态文件,它很可能比nginx更好,但它并不那么简单。 (Here's a "benchmark"比较nodejs文件服务器和lighttpd - 在提供静态文件时性能与ngingx类似。)
提供静态文件的性能通常不仅仅是执行工作的Web服务器。如果您希望获得最高性能,那么您将使用CDN来提供文件,以减少最终用户的延迟,并从边缘缓存中受益。
如果您不担心这一点,节点可以在大多数情况下正常提供静态文件。 Node适用于异步代码,它也依赖于异步代码,因为它的单线程和任何阻塞i / o都可以阻止整个进程,并降低应用程序的性能。您很可能以非阻塞方式编写代码,但如果您同步执行任何操作,则可能会导致阻塞,这会降低其他客户端获取其静态文件的速度。简单的解决方案是不编写阻止代码,但有时候这不是可能的,或者您无法始终强制执行它。
答案 5 :(得分:-9)
我确信在很多方面,纯粹的node.js可以胜过nginx。
所有人都说我必须保持NginX有一个内置的缓存,而node.js并没有安装工厂(你必须建立你自己的文件缓存)。 自定义文件缓存的性能优于nginx和市场上的任何其他服务器,因为它非常简单。
Nginx也运行在多个核心上。要充分发挥Node的潜力,您必须集群节点服务器。如果您有兴趣知道如何,请在下午。
你需要深挖掘来实现与节点的性能天堂,这是唯一的问题。一旦完成了地狱,是的......它击败了Nginx。