当前位置: 首页 > 知识库问答 >
问题:

Node.js事件循环-nginx/apache

慕嘉茂
2023-03-14

nginx和Node。js有事件循环来处理请求。我把nginx放在Node前面。这里已经推荐了jsas

仅使用Node.js与使用Node.jsApache/Nginx

使用此处显示的设置

节点。js Nginx-现在怎么办?

>

把Apache放在节点前面怎么样。js?Apache没有事件循环。只是线。所以不会把Apache放在节点前面。目的何在?

在这个2010年的演讲中,节点。js创建者Ryan Dahl的愿景是完全摆脱nginx/apache/任何东西,让node直接与internet对话。你认为这什么时候会成为现实?

共有3个答案

能修谨
2023-03-14

>

  • 事件循环是独立的。事件循环是在应用程序级别实现的,因此两者都不关心其他人使用哪种体系结构。

    NodeJS在很多方面都很擅长,但在某些地方它仍然步履蹒跚。一旦示例服务于静态文件。目前,nodejs在这个测试中的性能相当差,因此为静态文件提供专用的web服务器可以大大提高响应时间。此外,nodejs还处于初级阶段,在安全方面还没有像nginX上的Apache那样经过“测试和强化”。

    人们需要很长一段时间来考虑独自面对Nojjs。集群模块是朝着正确方向迈出的一步,但即使在达到v1之后,它也需要很长时间才能实现。

  • 海嘉赐
    2023-03-14

    我认为你的问题在很大程度上已经被其他一些答案所涵盖,但有一些部分遗漏了,还有一些我不同意,所以这里是我的:

    >

  • 事件循环在流程级别上相互隔离,但会相互作用。您最可能遇到的问题是nginx响应缓冲区、分块数据等的配置,但这是优化,而不是错误解决。

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

    人们已经在使用Node。js位于堆栈的前面。搜索基准会返回一些对Node有利的合理结果,所以性能对我来说不是问题。然而,仍然有理由将Nginx放在Node前面。

    >

  • 安全节点已经受到越来越多的审查,但它还很年轻。你在这里可能没有问题,但谨慎往往是你的朋友。

    培训-您雇佣的运营人员将知道如何管理Nginx,但定制节点应用程序的配置和管理将只有您的开发人员成功与之沟通的人才能理解。在一些公司,这是无名小卒。

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

  • 何超英
    2023-03-14

    >

  • nginx和Node都使用异步和事件驱动的方法。他们之间的沟通大致如下:

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

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

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

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

  •  类似资料:
    • 主要内容:事件驱动程序,实例,Node 应用程序是如何工作的?Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

    • 问题内容: Node.js I / O事件循环是单线程还是多线程? 如果我有多个I / O进程,则节点会将它们置于外部事件循环中。它们是按顺序处理(最快),还是处理事件循环以同时处理它们(…以及哪些限制)? 问题答案: 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。Nodejs本身在libuv之下使用了许多线程,但是您在编写nodejs代码时不

    • Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

    • 问题内容: 可以偷看事件循环进行诊断吗? 我想知道当前有多少事件在等待执行(不包括setTimeout / interval)。 更新:我想从正在运行的节点进程内部执行此操作。 问题答案: 使用setImmediate()为nodejs 0.10更新 虽然无法在队列中找到等待事件的数量,但发现了另一个可能有用的运行状况指标: 延迟将包含从排队事件到执行事件所花费的毫秒数。 这也考虑到了CPU密集型

    • 本文向大家介绍深入浅析Node.js 事件循环,包括了深入浅析Node.js 事件循环的使用技巧和注意事项,需要的朋友参考一下 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 (来源于Javascript是单线程又是异步的,但是这种语言有个共同的特点:它们是 event-driven 的。驱动它们的 event 来自一个异构的平台。) Node.js 的每一个

    • 事件是应用程序与自身各个功能模块以及与操作系统进行通讯的手段,也是实现事件驱动编程模型的基础,应用程序如果要响应这些事件,通常是创建一个事件队列来集中存放它们,从事件队列取出事件并调用对应处理器就是一次事件响应,而往复执行这个操作的过程就是事件循环。 驱动接口 LCUI 对事件循环的操作有处理事件、绑定事件和解绑事件,驱动模块的职责就是基于操作系统接口向 LCUI 提供实现了这些操作的接口。首先我

    • 问题内容: 首先,我开始尝试了解什么是Node.Js。我有两个问题。 第一个问题 从文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。 然后,考虑以下代码(从nodejs官方网站复制) 如果同时收到两个客户端请求,则意味着以下工作流程: 收到第一个http请求事件,收到第二个请求事件。 收到第一个事件后,将立即执行第一个事件的回调函数。 同

    • 问题内容: nodejs体系结构内部是否存在两个事件循环? libev / libuv v8 javascript事件循环 在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理? 基本上,libev和libeio如何集成到nodejs架构中? 是否有任何文档可以清楚地了解nodejs内部体系结构?