Node.js事件循环 - nginx/apache

7
nginx和Node.js都有事件循环来处理请求。我按照这里的建议将nginx放在Node.js前面。
使用此设置,仅使用Node.js与使用Node.js与Apache / Nginx一起使用Node.js + Nginx - 现在怎么办?
  1. 这两个事件循环如何协同工作?它们之间是否存在冲突的风险?我想知道,因为Nginx可能无法像Node.js一样每秒处理那么多事件,反之亦然。例如,如果Nginx每秒可以处理1000个事件,但Node.js只能处理500个,这不会引起问题吗?(我不知道1000、500是否合理,您可以纠正我。)

  2. 将Apache放在Node.js前面怎么样?Apache没有事件循环,只有线程。那么将Apache放在Node.js前面不是违背了初衷吗?

  3. 这次2010年的演讲中,Node.js的创始人Ryan Dahl有一个愿景,即完全摆脱nginx/apache/任何其他东西,直接让node与互联网交流。您认为这将成为现实的时间是什么时候?

4个回答

20
  1. nginx和Node都采用异步和事件驱动的方法。它们之间的通信大致如下:

    • nginx接收请求
    • nginx将请求转发到Node进程,并立即返回等待更多请求
    • Node从nginx接收请求
    • Node使用最小的CPU资源处理请求,直到某个时刻需要发出一个或多个I/O请求(从数据库中读取,写入响应等)。此时,它启动所有这些I/O请求,并返回等待更多请求。
    • 上述过程可能重复多次。您可以有成千上万个请求处于非阻塞等待状态,其中nginx正在等待Node,而Node正在等待I / O。在此期间,nginx和Node都准备好接受更多的请求!
    • 最终由Node进程启动的异步I / O将完成,调用回调函数。
    • 如果仍然有尚未完成的I / O请求,则Node会再次返回其循环。还可以发生一种情况,即一旦I / O操作完成,该数据就被Node回调消耗,然后需要进行新的I / O,因此Node可以在返回循环之前启动更多的异步I / O请求。
    • 最终,Node启动的特定请求的所有I / O操作都将完成,包括那些将响应写回nginx的操作。因此,Node结束此请求,然后像往常一样返回其循环。
    • nginx接收到指示响应数据已到达的事件,因此以非阻塞方式将该数据取出并写回客户端。当响应已写入客户端并触发事件时,nginx将结束该请求。

    您询问如果nginx和Node可以处理不同数量的最大连接会发生什么情况。它们实际上没有最大值,一般的最大值来自操作系统的配置,例如系统可以同时拥有的最大打开句柄数或CPU吞吐量等。因此,您的问题并不适用。如果系统被正确配置且所有进程都受到I/O限制,那么nginx和Node都不会阻塞。

  • 如果您可以保证Apache永远不会阻塞(即从未达到最大连接限制),那么将Apache置于Node前面只有很好的效果。但对于大量连接,这很难/不可能实现,因为Apache为每个连接使用单独的进程或线程。nginx和Node的可扩展性非常好,而Apache则不然。

  • 在没有其他服务器的情况下运行Node可以正常工作,并且应该适用于小型/中型负载站点。将Web服务器放在其前面的原因是,像nginx这样的Web服务器具有Node没有的功能,您需要自己实现。例如缓存、负载均衡、从同一服务器上运行多个应用程序等功能。


  • 2
    我认为其他人的回答已经涵盖了大部分你的问题,但还有一些遗漏的部分,以及一些我不同意的地方,所以这是我的观点:
    事件循环在进程级别上是相互隔离的,但它们会相互交互。您最有可能遇到的问题是关于nginx响应缓冲区、分块数据等配置方面的问题,但这是优化而不是错误解决。
    正如您所指出的,如果您使用Apache,那么您就取消了使用Node.js的好处,即大规模并发和Websockets。我不建议这样做。
    人们已经在他们的堆栈前端使用Node.js。搜索基准测试会返回一些看起来合理的结果,表明Node.js性能更好,因此性能在我看来不是一个问题。然而,仍然有理由将Nginx放在Node之前。
    1. 安全性- Node.js受到越来越多的关注,但它仍然很年轻。您可能在这里没有问题,但谨慎常常是您的朋友。
    2. 培训-运营人员您雇用的人将知道如何管理Nginx,但您自定义的Node应用程序的配置和管理只能被您的开发人员成功传达给这些人。在某些公司中,这个人可能是没有人。
    3. 运营灵活性-如果您达到规模,您可能希望将静态内容的服务拆分出来,仅仅为了减少应用服务器的负载。您可能希望将内容分配给不同的域并单独管理它,或者对不同的域或URL模式具有不同的SSL或代理行为。这些是运维人员在Nginx中容易配置的事情,但您必须在Node应用程序中手动编码。

    1
    1. 事件循环是独立的。事件循环在应用程序级别实现,因此彼此之间不关心对方使用的架构。

    2. NodeJS擅长许多事情,但在某些地方仍然存在问题。一个例子是提供静态文件服务。目前,nodejs在这个测试中表现相当差,因此为您的静态文件专门设置Web服务器可以大大提高响应时间。此外,nodejs仍处于初期阶段,并且在安全性方面像Apache或nginX那样经过“测试和加固”。

    3. 人们考虑单独使用nodejs作为前端需要很长时间。群集模块是朝着正确方向迈出的一步,但即使它达到v1后,也需要很长时间才能实现。


    1
    在这里需要提醒大家略加注意...很多人已经将Nodejs放在了他们的技术栈前沿。直到最近,如果你想使用WebSockets协议,那么Nodejs是必需的,因为Apache和Nginx都无法支持它。我并不是说这样没有风险,但许多人正在尝试。 - Richard Marr

    1
    1. 两个事件循环没有关联,它们不会一起运行。
    2. 是的,这相当无用。Apache 不是负载均衡器。
    3. Ryan Dahl 所说的可能已经适用了。并发用户的限制肯定比 Apache 更高。在 node.js 出现之前,具有相当数量并发用户的网站必须使用 nginx 来平衡负载。对于中小型企业来说,仅使用 node.js 就可以完成。但要完全排除 nginx 还需要时间。让 node.js 稳定下来才能实现这个雄心勃勃的梦想。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接