Node.js事件循环 – nginx / apache

nginx和Node.js都有事件循环来处理请求。 我把nginx放在Node.js的前面,就像这里推荐的那样

仅使用Node.js与使用Apache / Nginx的Node.js

在这里显示的设置

Node.js + Nginx – 现在什么?

  1. 两个事件循环如何一起玩? 两者之间有没有冲突的风险? 我想知道,因为Nginx可能无法像Node.js那样每秒处理多less事件,反之亦然。 例如,如果Nginx每秒可以处理1000个事件,而node.js只能处理500个事件,那么不会造成什么问题吗? (我不知道1000500是不是合理的数量级,你可以纠正我的。)

  2. 把Apache放在Node.js前面怎么样? Apache没有事件循环。 只是线程。 那么不要把Apache放在Node.js前面打败呢?

  3. 在这个2010年的演讲中 ,Node.js的创build者Ryan Dahl已经有了摆脱nginx / apache /无论如何的愿景,并且直接向互联网交谈节点。 你什么时候觉得这是现实?

  1. nginx和Node都使用异步和事件驱动的方法。 他们之间的沟通或多或少会像这样:

    • nginx收到一个请求
    • nginx将请求转发给Node进程,并立即返回等待更多的请求
    • 节点收到来自nginx的请求
    • 节点以最少的CPU使用率处理请求,直到需要发出一个或多个I / O请求(从数据库读取,写入响应等)。 此时它会启动所有这些I / O请求并返回等待更多的请求。
    • 以上可以重复很多次。 您可能有成千上万的请求都处于非阻塞等待状态,其中nginx正在等待节点,并且节点正在等待I / O。 而这种情况发生时,nginx和Node都准备好接受更多的请求!
    • 最终由Node进程启动的异步I / O将完成,并且将调用一个回调函数。
    • 如果仍然有I / O请求没有完成这个请求,那么节点又回到它的循环一次。 也可能发生的情况是,一旦I / O操作完成,这个数据被Node回调消耗,然后新的I / O需要发生,所以Node在回到循环之前可以启动更多的异步I / O请求。
    • 最后,Node为特定请求启动的所有I / O操作都将完成,包括那些将响应写回nginx的操作。 所以Node结束这个请求,然后一直回到它的循环。
    • nginx接收到一个事件,指出响应数据已经到达请求的地址,所以它将数据写回客户端,再次以非阻塞的方式写入。 当响应被写入客户端,事件将触发,nginx将结束请求。

    你在问如果nginx和Node可以处理不同数量的最大连接会发生什么。 它们实际上没有最大值,最大值通常来自操作系统配置,例如,系统一次可以打开的最大句柄数或CPU吞吐量。 所以你的问题并不适用。 如果系统配置正确并且所有进程都是I / O绑定的,那么nginx或Node都不会阻塞。

  2. 如果你能保证你的Apache永远不会被阻塞(即永远不会达到它的最大连接限制),那么把Apache放在Node前面将会工作得很好。 这对于大量的连接来说是难以/不可能实现的,因为Apache为每个连接使用单独的进程或线程。 nginx和Node的规模真的很好,Apache不。

  3. 运行节点没有在前面的另一台服务器正常工作,它应该是适合中小负载网站。 将Web服务器放在它前面的原因是,像nginx这样的Web服务器具有Node所没有的功能,您需要实现自己的功能。 像缓存,负载平衡,从同一台服务器上运行多个应用程序等。

我认为你的问题已经在很大程度上被其他一些答案所覆盖,但是有一些遗漏,有些我不同意,所以这里是我的:

  1. 事件循环在流程级别是相互隔离的,但是会互相影响。 你最可能遇到的问题是围绕nginx响应缓冲区的配置,分块的数据等,但这是优化而不是错误解决。

  2. 正如你所指出的那样,如果你使用Apache,你将无效使用Node.js的好处,即大规模的并发和websockets。 我不会推荐这样做。

  3. 人们已经在堆栈的前面使用了Node.js。 搜索基准测试会返回Node有利的一些合理的结果 ,所以在我看来,性能并不是问题。 但是,仍然有理由把Nginx放在Node前面。

    1. 安全 – 节点已经受到越来越多的审查,但还是年轻的。 你可能在这里没有问题,但小心往往是你的朋友。

    2. 培训 – 您雇用的Ops人员将知道如何管理Nginx,但您的开发人员成功地将自定义Node应用程序的配置和管理功能永远理解。 在一些公司,这是没有人。

    3. 操作灵活性 – 如果达到规模,您可能需要分离出静态内容,纯粹是为了减少应用服务器的负载。 您可能希望在不同域中拆分内容,并将其分开管理,或针对不同域或URL模式具有不同的SSL或代理行为。 这些对于Ops人来说很容易在Nginx中配置,但是你必须在Node应用程序中手动编写代码。

  1. 事件循环是独立的。 事件循环是在应用程序级别实现的,所以既不关心其他类型的体系结构。

  2. NodeJS擅长很多事情,但也有一些地方仍然动摇。 一旦示例正在提供静态文件。 目前,在这个测试中,nodejs性能相当差,因此为您的静态文件提供专用的Web服务器极大地缩短了响应时间。 另外,nodejs还处于起步阶段,在安全性方面还没有经过“测试和硬化”,比如nginx上的Apache。

  3. 人们需要很长时间来考虑面向nodejs。 群集模块朝着正确的方向迈出了一步,但是在发生v1之前,即使达到v1也需要很长时间。

  1. 两个事件循环都是无关的。 他们不一起玩。
  2. 是的,这是非常无用的。 Apache不是负载平衡器。
  3. Ryan Dahl所说的可能已经适用。 并发用户的数量肯定高于Apache。 在具有相当数量的并发用户的node.js网站之前,必须使用nginx来平衡负载。 对于中小型企业,只能使用node.js。 但是完全排除nginx需要时间。 让node.js在遵循这个雄心勃勃的梦想之前保持稳定。