国产黄色免费网站_久久天天做天天爱综合色_精品国产一区久久久_成人黄色激情网站_久久成人在线视频_美女一区二区在线观看_亚洲精品免费一区亚洲精品免费精品一区 _91精品国产综合久久精品麻豆

NodeJS服務(wù)總是崩潰的解決辦法

2020-3-23    seo達(dá)人

許多人都有這樣一種映像,NodeJS比較快; 但是因?yàn)槠涫菃尉€程,所以它不穩(wěn)定,有點(diǎn)不安全,不適合處理復(fù)雜業(yè)務(wù); 它比較適合對(duì)并發(fā)要求比較高,而且簡(jiǎn)單的業(yè)務(wù)場(chǎng)景。 

在Express的作者的TJ Holowaychuk的 告別Node.js一文中列舉了以下罪狀: 

Farewell NodeJS (TJ Holowaychuk) 

?   you may get duplicate callbacks 
?   you may not get a callback at all (lost in limbo) 
?   you may get out-of-band errors 
?   emitters may get multiple “error” events 
?   missing “error” events sends everything to hell 
?   often unsure what requires “error” handlers 
?   “error” handlers are very verbose 
?   callbacks suck 

其實(shí)這幾條主要吐嘈了兩點(diǎn): node.js錯(cuò)誤處理很扯蛋,node.js的回調(diào)也很扯蛋。

 

 

事實(shí)上呢?

 


事實(shí)上NodeJS里程確實(shí)有“脆弱”的一面,單線程的某處產(chǎn)生了“未處理的”異常確實(shí)會(huì)導(dǎo)致整個(gè)Node.JS的崩潰退出,來(lái)看個(gè)例子, 這里有一個(gè)node-error.js的文件: 

 

var http = require('http');

var server = http.createServer(function (req, res) {

  //這里有個(gè)錯(cuò)誤,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/');


啟動(dòng)服務(wù),并在地址欄測(cè)試一下發(fā)現(xiàn) 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.<anonymous> (c:githubscript
ode-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)



 

怎么解決呢?


其實(shí)Node.JS發(fā)展到今天,如果連這個(gè)問(wèn)題都解決不了,那估計(jì)早就沒人用了。 

 

使用uncaughtException


我們可以u(píng)ncaughtException來(lái)全局捕獲未捕獲的Error,同時(shí)你還可以將此函數(shù)的調(diào)用棧打印出來(lái),捕獲之后可以有效防止node進(jìn)程退出,如: 

 

process.on('uncaughtException', function (err) {
  //打印出錯(cuò)誤
  console.log(err);
  //打印出錯(cuò)誤的調(diào)用棧方便調(diào)試
  console.log(err.stack);
});


這相當(dāng)于在node進(jìn)程內(nèi)部進(jìn)行守護(hù), 但這種方法很多人都是不提倡的,說(shuō)明你還不能完全掌控Node.JS的異常。 

 

使用 try/catch


我們還可以在回調(diào)前加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);
};


這種方案的好處是,可以將錯(cuò)誤和調(diào)用棧直接輸出到當(dāng)前發(fā)生的網(wǎng)頁(yè)上。 

 

集成到框架中


標(biāo)準(zhǔn)的HTTP響應(yīng)處理會(huì)經(jīng)歷一系列的Middleware(HttpModule),最終到達(dá)Handler,如下圖所示: 

\ 


這 些Middleware和Handler在NodeJS中都有一個(gè)特點(diǎn),他們都是回調(diào)函數(shù),而回調(diào)函數(shù)中是唯一會(huì)讓Node在運(yùn)行時(shí)崩潰的地方。根據(jù)這個(gè) 特點(diǎn),我們只需要在框架中集成一處try/catch就可以相對(duì)完美地解決異常問(wèn)題,而且不會(huì)影響其它用戶的請(qǐng)求request。 

事實(shí)上現(xiàn)在的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();
  }


那么不在回調(diào)中產(chǎn)生的錯(cuò)誤怎么辦?不必?fù)?dān)心,其實(shí)這樣的node程序根本就起不起來(lái)。 

此外node自帶的 cluster 也有一定的容錯(cuò)能力,它跟nginx的worker很類似,但消耗資源(內(nèi)存)略大,編程也不是很方便,OurJS并沒有采用此種設(shè)計(jì)。 

 

守護(hù)NodeJS進(jìn)程和記錄錯(cuò)誤日志


現(xiàn) 在已經(jīng)基本上解決了Node.JS因異常而崩潰的問(wèn)題,不過(guò)任何平臺(tái)都不是100%可靠的,還有一些錯(cuò)誤是從Node底層拋出的,有些異常 try/catch和uncaughtException都無(wú)法捕獲。之前在運(yùn)行ourjs的時(shí)侯,會(huì)偶爾碰到底層拋出的文件流讀取異常,這就是一個(gè)底層 libuv的BUG,node.js在0.10.21中進(jìn)行了修復(fù)。 

面對(duì)這種情況,我們就應(yīng)該為nodejs應(yīng)用添加守護(hù)進(jìn)程,讓NodeJS遭遇異常崩潰以后能馬上復(fù)活。 

另外,還應(yīng)該把這些產(chǎn)生的異常記錄到日志中,并讓異常永遠(yuǎn)不再發(fā)生。 

 

使用node來(lái)守護(hù)node


node-forever 提供了守護(hù)的功能和LOG日志記錄功能。 

安裝非常容易 

 

[sudo] npm install forever


使用也很簡(jiǎn)單 

 

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


還可以看日志 

 

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


 

使用shell啟動(dòng)腳本守護(hù)node


使用node來(lái)守護(hù)的話資源開銷可能會(huì)有點(diǎn)大,而且也會(huì)略顯復(fù)雜,OurJS直接在開機(jī)啟動(dòng)腳本來(lái)進(jìn)程線程守護(hù)。 

如在debian中放置的 ourjs 開機(jī)啟動(dòng)文件: /etc/init.d/ourjs 

這個(gè)文件非常簡(jiǎn)單,只有啟動(dòng)的選項(xiàng),守護(hù)的核心功能是由一個(gè)無(wú)限循環(huán) while true; 來(lái)實(shí)現(xiàn)的,為了防止過(guò)于密集的錯(cuò)誤阻塞進(jìn)程,每次錯(cuò)誤后間隔1秒重啟服務(wù) 

 

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


 

錯(cuò)誤日志記錄也非常簡(jiǎn)單,直接將此進(jìn)程控制臺(tái)當(dāng)中的錯(cuò)誤輸出到error.log文件即可: 2>> $WEB_DIR/error.log  這一行, 2 代表 Error。

日歷

鏈接

個(gè)人資料

藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.newchinaweekly.com

存檔

久久久99精品免费观看| 欧美日韩久久久久| 亚洲一区二区三区美女| 欧美性高潮床叫视频 | 91成人看片| 激情成人午夜视频| 综合久久久久久久| 日韩三级免费观看| 一区二区免费看| 91精品国产综合久久蜜臀| 亚洲一区二区三区爽爽爽爽爽| 91国偷自产一区二区三区观看| 亚洲电影激情视频网站| 欧美成人性福生活免费看| 久久99国产精品自在自在app | 精品在线观看一区| 日韩成人免费在线观看| 五月激情丁香婷婷| 国产毛片视频| 色呦呦在线播放| porn视频在线观看| se69色成人网wwwsex| 亚洲欧洲中文字幕| 久久这里只有精品视频网| 欧美亚洲国产一卡| 欧美激情免费观看| 秋霞久久久久久一区二区| 三级av免费观看| 国产无人区码熟妇毛片多| 欧美另类极品videosbest视 | 亚洲国产一区二区三区高清| 久久亚洲影视婷婷| 欧美一区二区女人| 日韩精品免费在线视频观看| 日本久久久久久久| 免费网站在线观看视频| 中文字幕在线观看免费高清| 99在线观看免费| 狠狠操夜夜操| 国产精品一区二区三区四区在线观看| 1024日韩| 亚洲成精国产精品女| 久久69精品久久久久久久电影好| 免费在线观看91| 熟妇高潮一区二区| 欧美成人短视频| 青青草av专区| 电影在线一区| 亚洲精品成人图区| 在线视频亚洲欧美中文| 免费xxxx性欧美18vr| 色天天综合色天天久久| 18一19gay欧美视频网站| 国产毛片久久久久久国产毛片| 中文字幕在线观看2018| 欧美性猛交xxxx免费看手交| 米奇777四色精品人人爽| 亚洲午夜精品一区 二区 三区| 国产精品久久久久三级| 一区二区三区在线高清| 欧美日韩午夜影院| 成人国产在线视频| 伊人av在线播放| 天天射天天操天天干| 欧美激情二区| 亚洲婷婷免费| 欧美亚洲一区二区在线| 亚洲japanese制服美女| 精品视频站长推荐| 欧美gay1069大粗吊| 性欧美freesex顶级少妇| 香蕉久久国产| 欧美一区二区久久| 日本亚洲欧洲精品| 国产稀缺精品盗摄盗拍| eeuss影院www在线观看手机| 国产一区二区av在线| 不卡区在线中文字幕| 91高清视频免费看| 99re视频在线| 久久精品色妇熟妇丰满人妻| 美女被内谢流白浆高视频| 欧美日韩午夜电影网| 国产欧美一区二区精品婷婷| 久久久之久亚州精品露出| 一区二区久久精品| 欧美三级黄视频| 久久99久久久精品欧美| 26uuu久久综合| 日韩免费在线观看| 亚洲综合欧美日韩| 国产一级精品毛片| 成码无人av片在线观看网站| 秋霞成人午夜伦在线观看| 日韩av中文字幕在线免费观看| 午夜久久久久久久久久久| 欧美亚韩一区二区三区| 精品视频一二区| 久久精品欧洲| 色婷婷国产精品久久包臀| 国产免费一区二区三区| 九九热精品免费视频| 在线视频1区| 美女精品在线| 亚洲精品国产综合久久| 波多野结衣乳巨码无在线| www.成人在线观看| 经典三级一区二区| 中文字幕日本乱码精品影院| 国产在线拍揄自揄视频不卡99 | 久久综合九色欧美综合狠狠 | 日韩欧美色综合| 免费毛片网站在线观看| 中文字幕求饶的少妇| 嘿咻视频在线看| 丝袜亚洲另类丝袜在线| 中文一区二区视频| 日本成人xxx| 国产黄色高清视频| 亚洲成人看片| 毛片一区二区三区| 日韩欧美一级在线播放| 国产夫妻自拍一区| 午夜国产一级| jizzjizz欧美69巨大| 制服丝袜激情欧洲亚洲| 国产美女三级视频| 小小女视频网站色琼网站| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 欧美一级一区二区| 成人三级视频在线播放| 女人在下体塞跳蛋在线观看| 欧美一区网站| 一区二区三区天堂av| 日本护士做爰视频| 欧美性另类69xxxx| 全球成人免费直播| 亚洲成人一二三| 极品日韩久久| www.蜜臀av| 青青草久久爱| 亚洲福利视频久久| 免费不卡的av| 九色在线视频| 久久综合丝袜日本网| 国产亚洲欧美一区二区三区| 国产手机av在线| 国内精品麻豆美女在线播放视频 | 永久久久久久| 国产精品视频流白浆免费视频 | 97免费在线观看视频| 成人视屏在线观看| 欧美日韩一区视频| 伊人成人免费视频| 国产一二三区在线| 亚洲欧美成人一区二区三区| 中文字幕一区二区三区最新| 91tv在线观看| 奇米四色…亚洲| 9a蜜桃久久久久久免费| 性xxxxbbbb| 亚洲大胆av| 成人激情春色网| 亚洲影视第一页| 亚洲精品精选| 国产免费一区二区三区香蕉精| 无码任你躁久久久久久老妇| 欧美成人免费| 一区二区欧美国产| 乱子伦视频在线看| 日韩资源在线| 亚洲一卡二卡三卡四卡| 在线免费av播放| 成人免费在线观看| 亚洲高清三级视频| 亚洲欧美手机在线| 快射av在线播放一区| 色综合中文字幕国产| www.偷拍.com| 99热99re6国产在线播放| 久久久噜噜噜久久人人看| 日本一区二区三区四区在线观看| 国产精品免费视频一区二区三区| 日本强好片久久久久久aaa| 精品久久久久久一区| 国产95在线|亚洲| 国产精品一区不卡| 欧美 日韩 国产 在线观看| 2018av男人天堂| 国产精品白丝在线| 色婷婷狠狠18| 深夜国产在线播放| 精品国产欧美一区二区| 青娱乐国产在线视频| 免费看久久久| 91国产一区在线| 天堂在线资源库| 久久精品国产成人一区二区三区 | 在线免费av片| 伊人久久亚洲热|