有没有任何基准测试或比较表明:将nginx放在节点前并直接使用它来提供静态文件比仅使用节点并使用其来提供静态文件更快?
对我来说,nginx解决方案似乎更易管理,你有什么想法吗?
sendfile
方法,但是似乎需要编写一些代码,可以参考例如 http://blog.std.in/2010/09/09/using-sendfile-with-nodejs/。 - tuomassalo我快速地使用 ab -n 10000 -c 100
测试了提供静态 1406 字节的 favicon.ico
的性能,对比了 nginx、Express.js(静态中间件)和 clustered Express.js。希望这对你有所帮助:
不幸的是,我无法测试 1000 甚至 10000 个并发请求,因为在我的机器上,nginx 会开始抛出错误。
编辑:如 artvolk 所建议的那样,这是使用 cluster + static
中间件的结果(较慢):
static
中间件产生巨大影响。 - ruffrey我对 @gremo 的图表有不同的解释。在我的看法中,无论是 node 还是 nginx,在请求数量上都具有相同的扩展性(在 9-10k 之间)。当然,nginx 响应的延迟要比 node 快出一个恒定的 20ms,但我认为用户不一定会察觉到这种差异(如果您的应用程序构建得很好的话)。 如果给定一定数量的机器,考虑到大部分负载最初都将发生在 node 上,那么需要承受相当大的负载才会考虑将 node 机器转换为 nginx。 唯一的反驳是,如果您已经将一台机器专门用于 nginx 负载均衡,那么您也可以将其用于提供静态内容。
FWIW,我在AWS EC2 t2.medium实例上进行了一个相当大的文件下载测试(约60 MB),以比较这两种方法。
下载时间大致相同(约15秒),在两种情况下内存使用都很小(<= 0.2%),但是我在下载过程中得到了巨大的CPU负载差异:
express.static()
:3.0〜5.0%(单个节点进程)这是一个棘手的问题。如果你编写了一个非常轻量级的节点服务器来仅提供静态文件,它很可能比nginx表现更好,但情况并不那么简单。(这里有一个“基准测试”,比较了一个nodejs文件服务器和lighttpd - 在提供静态文件时与ngingx类似的性能)。
在提供静态文件方面的性能往往不仅仅取决于Web服务器的工作。如果您想获得最高的性能,您将使用CDN为终端用户提供文件以减少延迟,并从边缘缓存中受益。
如果您不担心这个问题,大多数情况下,节点可以很好地提供静态文件。节点适用于异步代码,因为它依赖于单线程和任何阻塞I/O都会阻塞整个进程,并降低应用程序的性能。很可能您正在以非阻塞方式编写代码,但如果您正在执行任何同步操作,则可能会导致阻塞,这将降低其他客户端获取其静态文件的速度。简单的解决方案是不编写阻塞代码,但有时这是不可能的,或者您不能始终强制执行它。
我确信纯粹的node.js在很多方面都能胜过nginx。
话虽如此,我必须承认NginX有内置缓存,而node.js并没有预装(你必须自己构建文件缓存)。 自定义文件缓存确实比nginx和市场上的其他服务器表现更好,因为它非常简单。
此外,Nginx可以运行在多个核心上。要充分发挥Node的潜力,你需要集群化node服务器。如果你对此感兴趣,请私信我了解详情。
要达到与node相媲美的性能境界,你需要深入挖掘,这是唯一的问题。一旦完成,它绝对能击败Nginx。