nginx和Node.js都有事件循环来处理请求。 我把nginx放在Node.js的前面,就像这里推荐的那样
仅使用Node.js与使用Apache / Nginx的Node.js
在这里显示的设置
Node.js + Nginx – 现在什么?
两个事件循环如何一起玩? 两者之间有没有冲突的风险? 我想知道,因为Nginx可能无法像Node.js那样每秒处理多less事件,反之亦然。 例如,如果Nginx每秒可以处理1000个事件,而node.js只能处理500个事件,那么不会造成什么问题吗? (我不知道1000500是不是合理的数量级,你可以纠正我的。)
把Apache放在Node.js前面怎么样? Apache没有事件循环。 只是线程。 那么不要把Apache放在Node.js前面打败呢?
在这个2010年的演讲中 ,Node.js的创build者Ryan Dahl已经有了摆脱nginx / apache /无论如何的愿景,并且直接向互联网交谈节点。 你什么时候觉得这是现实?
nginx和Node都使用异步和事件驱动的方法。 他们之间的沟通或多或少会像这样:
你在问如果nginx和Node可以处理不同数量的最大连接会发生什么。 它们实际上没有最大值,最大值通常来自操作系统配置,例如,系统一次可以打开的最大句柄数或CPU吞吐量。 所以你的问题并不适用。 如果系统配置正确并且所有进程都是I / O绑定的,那么nginx或Node都不会阻塞。
如果你能保证你的Apache永远不会被阻塞(即永远不会达到它的最大连接限制),那么把Apache放在Node前面将会工作得很好。 这对于大量的连接来说是难以/不可能实现的,因为Apache为每个连接使用单独的进程或线程。 nginx和Node的规模真的很好,Apache不。
运行节点没有在前面的另一台服务器正常工作,它应该是适合中小负载网站。 将Web服务器放在它前面的原因是,像nginx这样的Web服务器具有Node所没有的功能,您需要实现自己的功能。 像缓存,负载平衡,从同一台服务器上运行多个应用程序等。
我认为你的问题已经在很大程度上被其他一些答案所覆盖,但是有一些遗漏,有些我不同意,所以这里是我的:
事件循环在流程级别是相互隔离的,但是会互相影响。 你最可能遇到的问题是围绕nginx响应缓冲区的配置,分块的数据等,但这是优化而不是错误解决。
正如你所指出的那样,如果你使用Apache,你将无效使用Node.js的好处,即大规模的并发和websockets。 我不会推荐这样做。
人们已经在堆栈的前面使用了Node.js。 搜索基准测试会返回Node有利的一些合理的结果 ,所以在我看来,性能并不是问题。 但是,仍然有理由把Nginx放在Node前面。
安全 – 节点已经受到越来越多的审查,但还是年轻的。 你可能在这里没有问题,但小心往往是你的朋友。
培训 – 您雇用的Ops人员将知道如何管理Nginx,但您的开发人员成功地将自定义Node应用程序的配置和管理功能永远理解。 在一些公司,这是没有人。
操作灵活性 – 如果达到规模,您可能需要分离出静态内容,纯粹是为了减少应用服务器的负载。 您可能希望在不同域中拆分内容,并将其分开管理,或针对不同域或URL模式具有不同的SSL或代理行为。 这些对于Ops人来说很容易在Nginx中配置,但是你必须在Node应用程序中手动编写代码。
事件循环是独立的。 事件循环是在应用程序级别实现的,所以既不关心其他类型的体系结构。
NodeJS擅长很多事情,但也有一些地方仍然动摇。 一旦示例正在提供静态文件。 目前,在这个测试中,nodejs性能相当差,因此为您的静态文件提供专用的Web服务器极大地缩短了响应时间。 另外,nodejs还处于起步阶段,在安全性方面还没有经过“测试和硬化”,比如nginx上的Apache。
人们需要很长时间来考虑面向nodejs。 群集模块朝着正确的方向迈出了一步,但是在发生v1之前,即使达到v1也需要很长时间。