繁体   English   中英

Node.js事件循环 - nginx / apache

[英]The Node.js event loop - nginx/apache

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

仅使用Node.js与使用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 /无论是什么,让节点直接与互联网对话。 你觉得什么时候会成为现实?

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

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

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

  2. 将Apache置于Node之前只有在您可以保证Apache永远不会阻塞(即它永远不会达到其最大连接限制)时才能正常工作。 对于大量连接来说,这很难/不可能实现,因为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也需要很长时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM