我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么解决NodeJS服务总是崩溃的问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么解决NodeJS服务总是崩溃的问题

这篇文章主要介绍了怎么解决NodeJS服务总是崩溃的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务; 它比较适合对并发要求比较高,而且简单的业务场景。

事实上NodeJS里程确实有“脆弱”的一面,单线程的某处产生了“未处理的”异常确实会导致整个Node.JS的崩溃退出,来看个例子, 这里有一个node-error.js的文件:

var http = require('http');var server = http.createServer(function (req, res) {  //这里有个错误,params 是 undefined  var ok = req.params.ok;  res.writeHead(200, {'Content-Type': 'text/plain'});  res.end('Hello World');});server.listen(8080, '127.0.0.1');console.log('Server running at http://127.0.0.1:8080/');

启动服务,并在地址栏测试一下发现 http://127.0.0.1:8080/  不出所料,node崩溃了

$ node node-errorServer running at http://127.0.0.1:8080/c:githubscriptode-error.js:5  var ok = req.params.ok;                     ^TypeError: Cannot read property 'ok' of undefined    at Server.<anonymous> (c:githubscriptode-error.js:5:22)    at Server.EventEmitter.emit (events.js:98:17)    at HTTPParser.parser.onIncoming (http.js:2108:12)    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)    at Socket.socket.ondata (http.js:1966:22)    at TCP.onread (net.js:525:27)

怎么解决呢?

其实Node.JS发展到今天,如果连这个问题都解决不了,那估计早就没人用了。

使用uncaughtException

我们可以uncaughtException来全局捕获未捕获的Error,同时你还可以将此函数的调用栈打印出来,捕获之后可以有效防止node进程退出,如:

process.on('uncaughtException', function (err) {  //打印出错误  console.log(err);  //打印出错误的调用栈方便调试  console.log(err.stack);});

这相当于在node进程内部进行守护, 但这种方法很多人都是不提倡的,说明你还不能完全掌控Node.JS的异常。

使用 try/catch

我们还可以在回调前加try/catch,同样确保线程的安全。

var http = require('http');http.createServer(function(req, res) {  try {    handler(req, res);  } catch(e) {    console.log('', e, '', e.stack);    try {      res.end(e.stack);    } catch(e) { }  }}).listen(8080, '127.0.0.1');console.log('Server running at http://127.0.0.1:8080/');var handler = function (req, res) {  //Error Popuped  var name = req.params.name;  res.writeHead(200, {'Content-Type': 'text/plain'});  res.end('Hello ' + name);};

这种方案的好处是,可以将错误和调用栈直接输出到当前发生的网页上。

集成到框架中

标准的HTTP响应处理会经历一系列的Middleware(HttpModule),最终到达Handler,如下图所示:

怎么解决NodeJS服务总是崩溃的问题


这 些Middleware和Handler在NodeJS中都有一个特点,他们都是回调函数,而回调函数中是唯一会让Node在运行时崩溃的地方。根据这个 特点,我们只需要在框架中集成一处try/catch就可以相对完美地解决异常问题,而且不会影响其它用户的请求request。

事实上现在的NodeJS WEB框架几乎都是这么做的,如 OurJS开源博客所基于的 WebSvr

就有这么一处异常处理代码:

Line: 207  try {    handler(req, res);  } catch(err) {    var errorMsg      = ''      + 'Error ' + new Date().toISOString() + ' ' + req.url      + ''      + err.stack || err.message || 'unknow error'      + ''      ;    console.error(errorMsg);    Settings.showError      ? res.end('<pre>' + errorMsg + '</pre>')      : res.end();  }

那么不在回调中产生的错误怎么办?不必担心,其实这样的node程序根本就起不起来。

此外node自带的 cluster 也有一定的容错能力,它跟nginx的worker很类似,但消耗资源(内存)略大,编程也不是很方便,OurJS并没有采用此种设计。

守护NodeJS进程和记录错误日志

现 在已经基本上解决了Node.JS因异常而崩溃的问题,不过任何平台都不是100%可靠的,还有一些错误是从Node底层抛出的,有些异常 try/catch和uncaughtException都无法捕获。之前在运行ourjs的时侯,会偶尔碰到底层抛出的文件流读取异常,这就是一个底层 libuv的BUG,node.js在0.10.21中进行了修复。

面对这种情况,我们就应该为nodejs应用添加守护进程,让NodeJS遭遇异常崩溃以后能马上复活。

另外,还应该把这些产生的异常记录到日志中,并让异常永远不再发生。

使用node来守护node

node-forever 提供了守护的功能和LOG日志记录功能。

安装非常容易

[sudo] npm install forever

使用也很简单

$ forever start simple-server.js$ forever list  [0] simple-server.js [ 24597, 24596 ]

还可以看日志

forever -o out.log -e err.log my-script.js

使用shell启动脚本守护node

使用node来守护的话资源开销可能会有点大,而且也会略显复杂,OurJS直接在开机启动脚本来进程线程守护。

如在debian中放置的 ourjs 开机启动文件: /etc/init.d/ourjs

这个文件非常简单,只有启动的选项,守护的核心功能是由一个无限循环 while true; 来实现的,为了防止过于密集的错误阻塞进程,每次错误后间隔1秒重启服务

WEB_DIR='/var/www/ourjs'WEB_APP='svr/ourjs.js'#location of node you want to useNODE_EXE=/root/local/bin/nodewhile true; do    {        $NODE_EXE $WEB_DIR/$WEB_APP config.magazine.js        echo "Stopped unexpected, restarting "    } 2>> $WEB_DIR/error.log    sleep 1done

错误日志记录也非常简单,直接将此进程控制台当中的错误输出到error.log文件即可: 2>> $WEB_DIR/error.log  这一行, 2 代表 Error。

感谢你能够认真阅读完这篇文章,希望小编分享的“怎么解决NodeJS服务总是崩溃的问题”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么解决NodeJS服务总是崩溃的问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么解决NodeJS服务总是崩溃的问题

这篇文章主要介绍了怎么解决NodeJS服务总是崩溃的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。许多人都有这样一种映像,NodeJS比较快; 但是因为其是单线程,所以它
2023-06-14

tomcat崩溃问题怎么解决

Tomcat崩溃问题可能是由于多种原因引起的,包括配置错误、内存不足、线程死锁等。以下是一些可能的解决方法:1. 检查Tomcat的日志文件,查看错误信息以确定崩溃原因。日志文件通常位于Tomcat安装目录下的logs文件夹中。2. 确保T
2023-09-12

Linux系统崩溃问题怎么解决

这篇文章主要介绍“Linux系统崩溃问题怎么解决”,在日常操作中,相信很多人在Linux系统崩溃问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统崩溃问题怎么解决”的疑惑有所帮助!接下来
2023-06-13

腾讯云服务器崩溃怎么办解决不了问题

1.确认问题首先,当腾讯云服务器崩溃时,需要确认问题的具体原因。这可能需要检查服务器的日志文件或与腾讯云技术支持联系。确定问题后,可以采取以下措施来解决问题。2.重启服务器如果服务器崩溃是由于软件问题引起的,那么重启服务器可能会解决问题。可以通过腾讯云控制台或命令行界面来重启服务器。如果服务器无法响应,可以尝试使用腾讯云控制台的“强制关机”功能,然后再启动服务器。3.恢复备份如果服务器
2023-10-26

如何解决腾讯云服务器崩溃问题

1.确认服务器是否真的崩溃在处理服务器崩溃问题之前,首先需要确认服务器是否真的崩溃了。可以通过以下几种方式来确认:尝试通过SSH连接服务器,如果连接失败,则可能是服务器崩溃了。查看服务器的监控数据,如果CPU使用率、内存使用率等数据都为0,则可能是服务器崩溃了。尝试访问服务器上运行的应用程序,如果无法访问,则可能是服务器崩溃了。2.重启服务器如果确认服务器确实崩溃了,那么第一步是
2023-10-26

亚马逊服务器崩溃怎么解决的

检查配置:检查服务器的配置是否正确,确保所有软件和应用程序都是最新的,并且所有服务都是可用的。更新补丁:确保所有软件和应用程序都已更新到最新版本。如果您已经使用了最新版本,那么就不需要进行任何更改。检查硬件:确保服务器的硬件正常运行,如有必要,可以更换服务器硬件。检查错误日志:查看服务器上的错误日志,找到导致崩溃的错误,并进行修复。检查服务:确保所有服务都是可用的,如有必要,可以添加更多的服务。备...
2023-10-27

腾讯云服务器崩溃怎么解决的

如果您的腾讯云服务器出现服务器崩溃的情况,可能会导致您无法访问互联网或其他资源。这可能是由于以下原因造成的:DNS解析错误:腾讯云服务器可能会将域名转换为与您当前使用的DNS服务器不匹配的IP地址,这可能导致您无法访问互联网或其他网站。您可以尝试重新启动服务器、查看DNS服务器状态是否正确、或者更换DNS服务器或尝试手动设置DNS。网络连接问题:腾讯云服务器可能存在网络连接问题。有时,当您
2023-10-26

腾讯云服务器崩溃怎么解决

如果您的腾讯云服务器出现服务器崩溃的情况,可能会导致您无法访问互联网或其他资源。解决服务器崩溃问题的常见步骤如下:立即联系腾讯云官方技术支持团队,他们会协助您解决服务器崩溃问题。检查网络连接是否正常,确保网络连接正常,可以尝试使用其他网络连接方式连接到服务器。检查应用程序或网站是否正在运行,如果应用程序或网站运行缓慢,可能是服务器崩溃导致的。检查您的系统是否有足够的内存、磁盘空间或网络
2023-10-26

腾讯云服务器崩溃怎么解决的呢

检查服务器的配置文件:你可以使用VIM或者Git命令来检查服务器的配置文件,确保它们是正确的。检查网络连接:如果服务器配置在公共网络上,那么你可以尝试使用其他设备或者第三方网络工具来测试服务器是否工作正常。清除浏览器缓存:你可以使用360等浏览器清除缓存,确保浏览器能够正常运行。检查日志:你可以打开腾讯云官网,查看服务器的日志,确保服务器是否正常工作。重启服务器:如果上述方法无法解决问题,你可以尝试重启...
2023-10-27

亚马逊服务器崩溃了怎么解决

1.确认服务器是否真的崩溃了在处理服务器崩溃问题之前,首先需要确认服务器是否真的崩溃了。可以通过以下几种方式来确认:尝试访问服务器上的网站或应用程序,如果无法访问,则可能是服务器崩溃了。登录服务器并检查系统日志,查看是否有任何错误或异常信息。尝试通过SSH连接到服务器,如果无法连接,则可能是服务器崩溃了。2.重启服务器如果确认服务器确实崩溃了,那么最简单的解决方法就是重启服务器。可以通过以下几种方式来...
2023-10-27

亚马逊云服务器崩溃怎么解决

以下是一些可能的解决方案:监控服务器状态:定期监控服务器的状态,例如温度、CPU、内存、磁盘空间等,以便及时发现问题并采取措施解决。升级硬件:如果硬件无法提供足够的资源,则需要升级硬件以提供更高的性能和更大的内存。配置防火墙规则:配置防火墙规则以限制网络访问和防止未经授权的访问,从而保护服务器。升级软件:如果应用程序或服务出现故障或崩溃,需要升级相应的软件以修复或解决问题。恢复数据:如果数据丢失或...
2023-10-27

腾讯云服务器崩溃怎么办解决

在解决腾讯云服务器崩溃问题时,首先需要考虑的是如何确定问题的原因。一些常见的原因包括操作系统、应用程序、配置错误、网络连接等。对于操作系统问题,可以通过升级系统版本、修复漏洞等方式来解决。对于应用程序问题,可以通过检查代码、清除缓存等方式来解决。对于配置错误问题,可以通过重新配置应用程序来解决。对于网络连接问题,可以通
腾讯云服务器崩溃怎么办解决
2023-10-28

腾讯云服务器崩溃怎么办解决了

1.确认服务器是否真的崩溃了在处理服务器崩溃问题之前,首先需要确认服务器是否真的崩溃了。可以通过以下几种方式来确认:尝试通过SSH连接服务器,如果无法连接,说明服务器可能已经崩溃。尝试通过控制台或者远程桌面连接服务器,如果无法连接,说明服务器可能已经崩溃。尝试访问服务器上运行的应用程序或者网站,如果无法访问,说明服务器可能已经崩溃。2.查看服务器日志如果确认服务器已经崩溃,可以通
2023-10-26

阿里云服务器崩溃?微博怎么解决?

阿里云服务器是许多企业和个人的重要工具,但有时可能会出现服务器崩溃的问题,这可能会导致业务中断和数据丢失。本文将详细介绍如何解决阿里云服务器崩溃的问题,以及在微博上如何进行操作。一、阿里云服务器崩溃的原因及解决方法阿里云服务器崩溃的原因有很多,包括但不限于硬件故障、操作系统错误、软件冲突、网络问题、电源故障等。解
阿里云服务器崩溃?微博怎么解决?
2023-12-10

腾讯云服务器崩溃怎么办啊怎么解决

一、首先,我们需要确定问题出现的原因。一般来说,导致腾讯云服务器崩溃的原因有很多,如服务器配置、网络带宽、数据库故障等。因此,我们需要针对具体情况进行分析和排查,找出根本原因,以便进行有效的解决。二、接下来,我们需要采取有效的解决方案。对于服务器配置方面的问题,我们可以进行服务器扩容和升级,以提高服务器的性能和稳定性。
腾讯云服务器崩溃怎么办啊怎么解决
2023-10-28

腾讯云服务器崩溃怎么办解决了呢

一、服务器硬件故障当腾讯云服务器出现硬件故障时,用户可以先检查服务器硬件是否有故障,例如硬盘是否有坏道、内存是否有问题、网络是否畅通等。如果硬件没有问题,则可以尝试重新安装操作系统、重启服务器或者使用其他备份工具进行数据备份。二、服务器系统配置问题当服务器系统配置出现问题时,用户需要检查服务器的系统文件是否损坏、系统配
腾讯云服务器崩溃怎么办解决了呢
2023-10-28

亚马逊云服务器系统崩溃怎么解决的

检查服务器硬件:检查服务器的硬件是否正常工作,如CPU、内存、硬盘等。如果出现故障,需要及时进行维修和更新。检查网络连接:检查服务器的网络连接是否正常,确保网络连接稳定。如果网络不稳定,可能会导致数据传输失败,从而导致服务器崩溃。更新操作系统:更新服务器操作系统,以确保服务器能够稳定运行。如果操作系统更新失败,需要重新安装操作系统,并确保安装了最新的补丁和驱动程序。检查数据库:检查服务器的数据库是...
2023-10-27

阿里云服务器崩了怎么解决问题

如果您的阿里云服务器出现服务器崩溃的问题,可以按照以下步骤进行解决:1.确认问题:确保您的机器没有连接到远程或VPS虚拟机上,可以尝试使用其他网络连接或使用命令行工具如netstat-an查看服务器的连接状态。2.查找问题:如果您无法定位问题,可以在命令行中输入命令来查找和定位该问题,例如:netstat-an[service_name]。3.解决问题:如果问题没有解决,可以尝试将其保存在
2023-10-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录