Node.js事件循环- nginx/apache



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

仅使用Node.js vs.在Apache/Nginx中使用Node.js

设置如下所示

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直接与互联网对话。你认为这什么时候会成为现实?

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

      nginx接收到一个请求
  2. nginx将请求转发给Node进程并立即返回等待更多请求
  3. Node接收到nginx的请求
  4. Node以最小的CPU使用量处理请求,直到需要发出一个或多个I/O请求(从数据库读取、写响应等)。此时,它启动所有这些I/O请求,然后返回等待更多的请求。
  5. 以上可以重复很多次。你可能有成千上万的请求都处于非阻塞等待状态,nginx在等待Node, Node在等待I/O。当这种情况发生时,nginx和Node都准备好接受更多的请求!
  6. 最终由Node进程启动的异步I/O将完成并调用回调函数。
  7. 如果这个请求仍然有I/O请求没有完成,那么Node将再次回到它的循环。也可能发生这样的情况,一旦一个I/O操作完成,这个数据被Node回调消耗,然后需要发生新的I/O,所以Node可以在返回循环之前启动更多的异步I/O请求。
  8. 最终,Node为特定请求启动的所有I/O操作都将完成,包括那些将响应写回nginx的操作。所以Node结束这个请求,然后像往常一样回到它的循环。
  9. nginx接收到一个事件,表明响应数据已经到达请求,所以它接受该数据并将其写回客户端,再次以非阻塞的方式。当响应被写入客户端并触发事件时,nginx将结束请求。
  10. 你问的是如果nginx和Node可以处理不同数量的最大连接会发生什么。它们实际上没有最大值,最大值通常来自操作系统配置,例如系统一次可以拥有的最大打开句柄数或CPU吞吐量。所以你的问题并不适用。如果系统配置正确,并且所有进程都是I/O绑定,那么nginx和Node都不会阻塞。

  11. 把Apache放在Node的前面,只有当你能保证你的Apache永远不会阻塞(即它永远不会达到最大连接限制),才会工作得很好。对于大量连接来说,这很难/不可能实现,因为Apache为每个连接使用单独的进程或线程。

  12. 运行Node没有另一个服务器在前面工作良好,它应该是好的小/中等负载站点。把web服务器放在它前面的原因是,像nginx这样的web服务器具有Node没有的功能,你需要自己实现。比如缓存、负载平衡、在同一台服务器上运行多个应用等等。

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

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

  2. 正如你所指出的,如果你使用Apache,你就抵消了使用Node.js的好处,即大量并发和websockets。我不建议你这么做。

  3. 人们已经在他们的堆栈前面使用Node.js了。搜索基准测试会得到一些对Node有利的合理结果,因此在我看来,性能不是问题。然而,仍然有理由把Nginx放在Node前面。

    1. Security - Node受到了越来越多的审查,但它仍然很年轻。你在这里可能没有问题,但谨慎往往是你的朋友。

    2. Training -您雇用的运维人员将知道如何管理Nginx,但是您的自定义Node应用程序的配置和管理将只有那些开发人员成功沟通的人才能理解。

    3. 操作灵活性—如果您达到规模,您可能希望拆分静态内容的服务,纯粹是为了减少应用程序服务器的负载。您可能希望在不同的域之间拆分内容并将其单独管理,或者为不同的域或URL模式设置不同的SSL或代理行为。这些东西对于运维人员来说很容易在Nginx中配置,但你必须在Node应用程序中手动编写。

  1. 事件循环是独立的。事件循环是在应用程序级别实现的,所以两者都不关心对方使用哪种架构。

  2. NodeJS在很多方面都很好,但也有一些地方它仍然步履蹒跚。一个例子是提供静态文件。目前,nodejs在这个测试中的表现相当差,所以为你的静态文件提供一个专用的web服务器大大提高了响应时间。此外,nodejs还处于起步阶段,在安全问题上还没有像Apache在nginX上那样经过"测试和强化"。

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

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

最新更新