网易首页 > 网易号 > 正文 申请入驻

NodeJS服务总是崩溃的解决办法

0
分享至

原文链接:https://blog.csdn.net/xiunai78/article/details/40378965/

许多人都有这样一种印象,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-error
Server running at http://127.0.0.1:8080/

c:githubscript
ode-error.js:5
var ok = req.params.ok;
^
TypeError: Cannot read property 'ok' of undefined
at Server.
(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,如下图所示:

这些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('')
: res.end();
}
' + errorMsg + '

那么不在回调中产生的错误怎么办?不必担心,其实这样的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 use
NODE_EXE=/root/local/bin/node

while true; do
{
$NODE_EXE $WEB_DIR/$WEB_APP config.magazine.js
echo "Stopped unexpected, restarting

"
} 2>> $WEB_DIR/error.log
sleep 1
done

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
3-0横扫越南!赢球最大功臣不是吴梦洁庄宇珊 是她一人防守顶全队

3-0横扫越南!赢球最大功臣不是吴梦洁庄宇珊 是她一人防守顶全队

冷桂零落
2026-08-29 11:04:38
CCTV5直播,中国男篮PK黎巴嫩,杨瀚森取代胡金秋,做好2点可赢球

CCTV5直播,中国男篮PK黎巴嫩,杨瀚森取代胡金秋,做好2点可赢球

体坛小快灵
2026-08-28 09:33:40
孙宇晨三大预言

孙宇晨三大预言

风风顺
2026-08-28 03:15:07
老人因“鱼头对自己”怒斥小辈,被怼到哑口无言:没生在紫禁城,就别那么多穷规矩!

老人因“鱼头对自己”怒斥小辈,被怼到哑口无言:没生在紫禁城,就别那么多穷规矩!

妍妍教育日记
2026-08-16 10:05:09
景甜体面回应收获路人好感,单日涨粉超10万,彩礼纠纷舆论反转

景甜体面回应收获路人好感,单日涨粉超10万,彩礼纠纷舆论反转

行舟问茶
2026-08-29 09:58:48
“妥妥的伪军气质!”学校推出“舒适版”军训,家长恨铁不成钢!

“妥妥的伪军气质!”学校推出“舒适版”军训,家长恨铁不成钢!

林林先生
2026-08-27 18:34:31
豪门真难进!华晨宇给孩子做2次亲子鉴定,彻底断了张碧晨豪门梦

豪门真难进!华晨宇给孩子做2次亲子鉴定,彻底断了张碧晨豪门梦

八卦王者
2026-07-13 13:18:19
深度还原:中美南海撞机后,美军有40分钟,为何没能把机密抹掉?

深度还原:中美南海撞机后,美军有40分钟,为何没能把机密抹掉?

干史人
2025-08-30 07:00:02
2亿多灵活就业人员怒了!原来北大张丹丹才是福利的受益者

2亿多灵活就业人员怒了!原来北大张丹丹才是福利的受益者

财话连篇
2026-08-22 18:44:09
属牛家庭下半年警报拉响!3件大事逼近,早准备早安心

属牛家庭下半年警报拉响!3件大事逼近,早准备早安心

白浅娱乐聊
2026-08-28 07:02:42
福州夫妻用1234万购得清代府邸,翻修绣楼时发现暗室,查看后傻眼

福州夫妻用1234万购得清代府邸,翻修绣楼时发现暗室,查看后傻眼

今天说故事
2025-08-28 18:30:53
魏敏芝现状曝光:在美国当导演,定居夏威夷,如今40岁胖到不敢认

魏敏芝现状曝光:在美国当导演,定居夏威夷,如今40岁胖到不敢认

文刀贰
2026-07-01 22:39:01
“羞辱式”劝退107名应届生!星宇股份1.5万补贴已到账

“羞辱式”劝退107名应届生!星宇股份1.5万补贴已到账

凤凰网财经
2026-08-28 23:40:32
出伏后,建议中年人:别太心疼钱,多吃3种肉,平安出伏好过秋

出伏后,建议中年人:别太心疼钱,多吃3种肉,平安出伏好过秋

江江食研社
2026-08-28 08:41:50
彻底摊牌了?一个欠9亿一个骗13.9亿,董卿被爆猛料,原来她和王丽坤同样困境

彻底摊牌了?一个欠9亿一个骗13.9亿,董卿被爆猛料,原来她和王丽坤同样困境

她时尚丫
2026-08-07 18:55:34
公司组织去三亚团建,到了机场才发现唯独没我的票,我转头回家,半夜领导连打10个电话:核心服务器崩了,损失快3个亿

公司组织去三亚团建,到了机场才发现唯独没我的票,我转头回家,半夜领导连打10个电话:核心服务器崩了,损失快3个亿

晓艾故事汇
2026-08-28 08:04:45
决定日!曝马竞给阿尔瓦雷斯下通牒:要么去阿森纳 要么留下道歉

决定日!曝马竞给阿尔瓦雷斯下通牒:要么去阿森纳 要么留下道歉

新英体育
2026-08-29 10:27:29
属猴人留意:8 月 28日 —31 日,身边亲人或将出现意外变动

属猴人留意:8 月 28日 —31 日,身边亲人或将出现意外变动

叮当当科技
2026-08-28 10:25:21
马筱梅喂儿子米糊,6个月旺宝解锁辅食新技能,长相越来越像爷爷

马筱梅喂儿子米糊,6个月旺宝解锁辅食新技能,长相越来越像爷爷

笑饮孤鸿非
2026-08-28 07:21:32
我安静提交离职申请,正低头给男助理审批高额加薪的妻子笑容瞬间凝固

我安静提交离职申请,正低头给男助理审批高额加薪的妻子笑容瞬间凝固

风起见你
2026-08-28 08:43:00
2026-08-29 11:40:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

美团扭亏为盈后,外卖大战结束了吗?

头条要闻

父亲自驾上万公里送娃上学:女儿去黑龙江 儿子去新疆

头条要闻

父亲自驾上万公里送娃上学:女儿去黑龙江 儿子去新疆

体育要闻

曼城花1个亿,买下了摩洛哥的“国民女婿”

娱乐要闻

孙宇晨最新发声:惊扰景女士非本意

财经要闻

刑自强:AI投资下半场中国蓄势待发

汽车要闻

东风日产NX8“喜柿橙意”限定色正式上市

态度原创

本地
艺术
手机
房产
公开课

本地新闻

昆明的雨,解锁汪曾祺的浪漫雨季

艺术要闻

18幅 画家来源笔下的安静女子

手机要闻

消息称荣耀Magic9系列两款新机疑入网,9月底发布

房产要闻

突发,三亚又大量卖地!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版