nodejs搭建web服务器就是这么简单!

nodejs搭建web服务器就是这么简单!,第1张

Nodejs 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Nodejs 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Nodejs 的包管理器 npm,是全球最大的开源库生态系统。(nodejs官网上的介绍),正如官网上介绍的那样,nodejs确实很牛!怎么个牛法?看看下面的代码就知道了。

//引入>1安装nodejs服务(从官网下载安装),node相当于apache服务器
2在自己定义的目录下新建服务器文件如 serverjs
例如,我在E:\PhpProject\html5\websocket下创建了serverjs文件
var >

如果您看到上面的错误,这意味着您的 NodeJS 应用程序内存不足,它消耗的内存超过了分配的内存,最终导致它自行终止。

当应用程序批处理大量数据时,数据处理算法的编写方式使其需要保留堆空间中的对象,直到处理完成。随着处理的进行,应用程序逐渐使用了更多内存,V8也将 将花费更多时间进行垃圾收集以释放未使用的内存,直到最终达到分配给进程的限制并导致了OOM。

Nodejs 运行时在内存使的用方面非常高效,因此程序通常使用默认限制运行良好。并且,如果没有主动设置最大堆大小,程序则会使用默认内存限制,并且此默认值也是会根据 Nodejs 版本和程序运行的系统架构而有所不同。

下面我们具体了解一下:

JavaScript与Java一样,由垃圾回收机制来进行自动的内存管理。对于性能敏感的服务器端程序,内存管理的好坏、垃圾回收状况是否优良,都会对服务构成影响。而在Node中,这一切与V8引擎息息相关。

网上大都说,Node中通过JavaScript只能使用部分内存(64位约14G,32位约07G)。V8对内存做了限制。因此这种限制下,将会导致Node无法直接 *** 作大内存对象。但是随着版本升级,这个数据好像不是那么绝对。

关于限制官方也没直接说明(主要不确定是否能通过bufferconstantsMAX_LENGTH直接类比),所以写个小程序大概在64位系统上跑一下。

Nodejs (64位实测)版本限制

官方文档bufferconstantsMAX_LENGTH

为了解决 OOM 错误,您需要做的就是显式配置内存限制使用 Nodejs 命令行选项

Javascript:

Typescript的 ts-node :

这就能快速解决 Nodejs 内存不足的问题!

建议始终明确设置, --max-old-space-size 而不是依赖 Nodejs 的默认值,因为在较新的 Nodejs 版本中默认值可能会更改。

在具有 2 GB 内存的机器上,考虑将其设置为 1536 (15 GB) 以留出一些内存用于其他用途并避免内存交换。
如果您在小型机器(例如 Raspberry Pi 板)上使用 Nodejs 运行简单的 Web 服务器,您可以将 设置 --max-old-space-size 为适当的小值,例如 128 MB,以避免 Nodejs 占用过多宝贵的内存。

关于pm2的具体使用请查看我的文章 Node服务与pm2实战

通过我们除了前端项目编译(各种cli等等)可能出现内存不足,node服务端也可能导致此问题。前端编译我们很简单的借助增加默认内存可以解决,但是服务端部署是一个持续过程,我们很少使用node直接启动的方式启动服务。我们通常借助 pm2 工具来进行,它可以在服务因异常或其他原因被杀掉后进行自动重启。 由于Node的单线程特征,自动重启能很大程度上的提高它的健壮性。

因为我们服务端使用pm2的目的之一,是服务出问题自动重启,而万一我们设置的内存不足或者服务考虑不足有些问题,导致服务内存不足崩溃对于生产环境来说很不友好。而 pm2 针对内存不足也有一个重启命令,一旦内存不足,会自动重启服务,防止整个服务卡死。

当内存超过1024M时自动重启。 如果工程中有比较棘手的内存泄露问题,这个算是一个折中方案。

pm2其实也是支持配置文件来启动的,我们也可以借助配置文件来配置命令与参数:

node创建虚拟服务器并设置根目录这样做:一个目录的创建和nodejs几乎没有任何关系,如果是Linux系统用 mkdir + 你的文件名字 如果是window系统,那就直接md + 你的文件名字。

NodeJs的优势:

现在的很多的服务器端的语言(PHP,JAVA,ASPnet),有什么问题呢,现在的服务器端的语言在用户访问服务器时,为每个用户链接创建了一个线程,但每个线程大约要耗费2M的内存,如果一个8G内存的服务器,也就能链接4000个左右的用户,如果用户的链接数较大,就必须增加服务器的数量,而且现在用户的链接方式有很多(如app,网页同时访问),这就又涉及到服务器共享的问题,所以服务器怎么支持最大的同时链接用户量就成了一个问题;

NodeJS修改了客户端到服务器端的链接方法,解决了这个问题,他不在为每个客户端创建一个新的线程,而是为每个客户端链接出发一个NodeJs内部进行处理的事件,所以NodeJS具备同时处理多达几万个用户的客户端链接的能力;

NodeJS适合开发的应用程序:

当应用程序需要处理大量并发的输入/输出,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,我们应该考虑使用NodeJs来进行应用程序的开发,例如:

1、聊天服务器:如果聊天的人很多,用户的与服务器之间的并发链接量很大,但是服务器端的数据处理并不复杂;

2、综合类服务网站和电子商务网站的服务器:在这类网站中的服务器端,往往可能每秒存内可以接受多达上千条的数据并且需要将这些数据写入数据库中,NodeJs可以通过其队列机制将这些数据迅速写入缓存区中,然后再通过每一个单独的处理从缓存区中取出这些数据并将其写入数据库中,如果是其他的服务器(如Apache服务器或Tomcat服务器)的话,由于这些服务器采用的是阻塞型I/O机制,因此每条数据写入到数据库中都要等待一段时间(等上一条写完,才能写下一条),但是NodeJs使用的是非阻塞的I/O机制,因此可以实现这些数据到数据库中的写入,而不必再为每条数据的写入而等待一段时间;

总结:

一个规模稍微大点的系统都不是一种开发语言可以搞定的,往往是几种混杂一起,比如c、c做服务器端开发,java做业务逻辑,php等做前端展示,此外还需要消息中间件等等。

nodejs可以很快地在服务器端做原型(原来只有c系和java等能做的事情,性能还很高),而且代码量相对会少很多;另一点是它的语法优势,js闭包等。但它不太适合做cpu密集型处理的工作,只能绕着弯去解决,据说这次QCon会有人分享这方面的研究成果,可以关注下。

每种语言都有它适合的领域,没必要强求一门语言可以解决所有事情,拥有其它语言的特性,只有不断的tradeoff把系统做出来才是目标。这些都是丛书上看到总结的,还望指正


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10661031.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存