6

Both nginx and Node.js have event loops to handle requests. I put nginx in front of Node.js as has been recommended here

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

with the setup shown here

Node.js + Nginx - What now?

  1. How do the two event loops play together? Is there any risk of conflicts between the two? I wonder because Nginx may not be able to handle as many events per second as Node.js or vice versa. For example, if Nginx can handle 1000 events per second but node.js only 500, won't that cause issues? (I have no idea if 1000,500 are reasonable orders of magnitude, you could correct me on that.)

  2. What about putting Apache in front of Node.js? Apache has no event loop. Just threads. So won't putting Apache in front of Node.js defeat the purpose?

  3. In this 2010 talk, Node.js creator Ryan Dahl had vision to get rid of nginx/apache/whatever entirely and make node talk directly to the internet. When do you think this will be reality?

4

4 回答 4

18
  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 都不会阻塞。

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

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

于 2013-06-02T18:10:44.443 回答
2

我认为您的问题在很大程度上已被其他一些答案所涵盖,但是缺少一些部分,有些我不同意,所以这是我的:

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

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

  3. 人们已经在他们的堆栈前端使用 Node.js。搜索基准会返回一些有利于 Node 的合理结果,因此在我看来性能不是问题。但是,仍然有理由将 Nginx 放在 Node 前面。

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

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

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

于 2013-06-05T10:06:54.223 回答
1
  1. 事件循环是独立的。事件循环是在应用程序级别实现的,因此两者都不关心其他人使用哪种架构。

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

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

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