【问题标题】:The Node.js event loop - nginx/apacheNode.js 事件循环 - nginx/apache
【发布时间】:2013-05-23 03:57:03
【问题描述】:

nginx 和 Node.js 都有事件循环来处理请求。我按照这里的建议将 nginx 放在 Node.js 前面

Using Node.js only vs. using Node.js with Apache/Nginx

这里显示的设置

Node.js + Nginx - What now?

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

  2. 把 Apache 放在 Node.js 前面怎么样? Apache 没有事件循环。只是线程。那么将 Apache 放在 Node.js 前面会不会破坏目的?

  3. this 2010 talk 中,Node.js 的创建者 Ryan Dahl 设想完全摆脱 nginx/apache/whatever 并让节点直接与互联网对话。您认为这何时会成为现实?

【问题讨论】:

    标签: apache node.js nginx


    【解决方案1】:

    我认为其他一些答案已基本涵盖了您的问题,但是缺少一些部分,有些我不同意,所以这里是我的:

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

    2. 正如您所指出的,如果您使用 Apache,您将抵消使用 Node.js 的好处,即大规模并发和 websocket。我不建议这样做。

    3. 人们已经在他们的堆栈前端使用 Node.js。搜索基准会返回一些 reasonable-looking results 对 Node 有利,因此在我看来性能不是问题。不过,还是有理由把 Nginx 放在 Node 前面。

      1. 安全性 - 节点受到越来越多的审查,但它还很年轻。您在这里可能没有问题,但谨慎通常是您的朋友。

      2. 培训 - 您雇用的运维人员会知道如何管理 Nginx,但您的自定义 Node 应用程序的配置和管理只有您的开发人员成功沟通过的人才能理解到。在某些公司中,这是无人问津的。

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

    【讨论】:

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

        • nginx 收到请求
        • nginx将请求转发给Node进程并立即返回等待更多请求
        • 节点收到来自nginx的请求
        • 节点以最少的 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 都不会阻塞。

      2. 只有在保证 Apache 永远不会阻塞(即永远不会达到其最大连接限制)的情况下,将 Apache 放在 Node 前面才能正常工作。这对于大量连接来说很难/不可能实现,因为 Apache 为每个连接使用单独的进程或线程。 nginx 和 Node 的扩展性非常好,Apache 没有。

      3. 在前面没有其他服务器的情况下运行节点工作正常,对于中小型负载站点应该没问题。首选将 Web 服务器放在其前面的原因是,像 nginx 这样的 Web 服务器具有 Node 所没有的功能,您需要自己实现。诸如缓存、负载平衡、从同一服务器运行多个应用程序等。

      【讨论】:

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

        【讨论】:

          【解决方案4】:
          1. 事件循环是独立的。事件循环是在应用程序级别实现的,因此两者都不关心其他人使用哪种架构。

          2. NodeJS 在很多方面都很擅长,但在某些地方它仍然步履蹒跚。一旦示例提供静态文件。目前,nodejs 在这个测试中的表现相当差,所以为你的静态文件配备一个专用的 Web 服务器可以大大缩短响应时间。此外,nodejs 还处于起步阶段,在安全问题上还没有像 Apache on nginX 那样经过“测试和强化”。

          3. 人们需要很长时间才能考虑将 nodejs 完全放在前面。集群模块是朝着正确方向迈出的一步,但即使达到 v1 也需要很长时间。

          【讨论】:

          • 这里有一点盐......人们已经把 Nodejs 放在了他们的堆栈的前面。直到最近,如果您想使用 websockets,它是必需的,因为 Apache 和 Nginx 都无法支持它。我并不是说这并非没有风险,但人们正在这样做。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-13
          • 2015-07-14
          • 1970-01-01
          • 2018-01-15
          • 1970-01-01
          • 1970-01-01
          • 2019-02-20
          相关资源
          最近更新 更多