99久久精品国产片-99久久精品国产免费-99久久精品国产麻豆-99久久精品国产国产毛片-99久久精品国产高清一区二区-99久久精品费精品国产一区二区

NodeJS服務總是崩潰的解決辦法

2020-3-23    seo達人

許多人都有這樣一種映像,NodeJS比較快; 但是因為其是單線程,所以它不穩定,有點不安全,不適合處理復雜業務; 它比較適合對并發要求比較高,而且簡單的業務場景。 

在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 

其實這幾條主要吐嘈了兩點: node.js錯誤處理很扯蛋,node.js的回調也很扯蛋。

 

 

事實上呢?

 


事實上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.<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)



 

怎么解決呢?


其實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('<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 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。

日歷

鏈接

個人資料

藍藍設計的小編 http://www.lapeinture.cn

存檔

99色精品| 日本伦理网站| 国产亚洲精品aaa大片| 欧美爱爱动态| 九九精品久久| 999精品在线| 亚洲精品中文字幕久久久久久| 欧美激情一区二区三区视频高清| 四虎影视久久久免费| 日本乱中文字幕系列| 日韩专区第一页| 久久99中文字幕| 日韩免费在线视频| 你懂的福利视频| 一级毛片视频在线观看| 一级片片| 97视频免费在线| 你懂的日韩| 久久国产一久久高清| 97视频免费在线| 国产精品免费久久| 精品国产三级a| 台湾毛片| 深夜做爰性大片中文| 天天色成人| 91麻豆精品国产自产在线观看一区| 欧美另类videosbestsex高清| 国产精品1024永久免费视频 | 精品国产一区二区三区精东影业| 国产欧美精品| 国产麻豆精品hdvideoss| 欧美激情一区二区三区在线播放| 久久99这里只有精品国产| 日韩在线观看视频免费| 精品视频免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品久久久久久影院免费| 97视频免费在线| 二级片在线观看| 一级女性大黄生活片免费| 国产一区二区精品| 国产伦精品一区三区视频| 日本在线www| 久久国产一久久高清| 免费国产在线视频| 天天做人人爱夜夜爽2020毛片| a级黄色毛片免费播放视频| 国产极品白嫩美女在线观看看| 999久久久免费精品国产牛牛| 日韩av片免费播放| 日韩一级黄色| 日韩中文字幕在线亚洲一区| 国产伦久视频免费观看视频| 国产伦精品一区三区视频| 免费的黄视频| 日本伦理片网站| 日韩专区亚洲综合久久| 欧美爱爱动态| 精品国产香蕉在线播出 | 黄视频网站在线观看| 免费一级片网站| 国产一级生活片| 精品视频一区二区三区免费| 韩国三级视频在线观看| 欧美一区二区三区在线观看| 九九热精品免费观看| 可以免费在线看黄的网站| 亚洲天堂免费观看| 九九精品久久| 欧美国产日韩一区二区三区| 四虎影视精品永久免费网站| 精品国产亚一区二区三区| 久久99青青久久99久久| 999久久久免费精品国产牛牛| 成人高清免费| 精品国产一区二区三区久久久蜜臀| 九九热精品免费观看| 国产伦久视频免费观看视频| 国产视频一区二区在线观看| 国产极品白嫩美女在线观看看| 亚洲天堂免费| 日本免费区| 日本在线不卡免费视频一区| 精品美女| 91麻豆tv| 国产麻豆精品视频| 日韩专区亚洲综合久久| 黄视频网站在线免费观看| 在线观看成人网 | 精品毛片视频| 精品国产一区二区三区国产馆| 成人高清免费| 日韩欧美一二三区| 日韩一级黄色| 国产91精品一区二区| 国产91丝袜在线播放0| 高清一级片| 尤物视频网站在线| 青青青草影院 | 欧美a免费| 亚洲不卡一区二区三区在线 | 国产a网| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 一级女性全黄生活片免费| 亚欧成人毛片一区二区三区四区| 九九精品久久| 午夜欧美成人久久久久久| 91麻豆精品国产片在线观看| 九九热精品免费观看| 97视频免费在线观看| 麻豆系列 在线视频| 天天色色色| 国产一区二区福利久久| 亚洲第一页乱| 国产高清在线精品一区二区 | 麻豆系列 在线视频| 国产视频一区二区三区四区| 黄视频网站在线免费观看| 亚洲 国产精品 日韩| 天天做日日干| 午夜在线亚洲男人午在线| 麻豆系列国产剧在线观看| 欧美a级成人淫片免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品视频免费观看| 91麻豆tv| 精品毛片视频| 亚洲女人国产香蕉久久精品 | 国产亚洲精品aaa大片| 四虎影视精品永久免费网站| 韩国三级香港三级日本三级la| 国产精品免费久久| 91麻豆精品国产高清在线| 久久精品成人一区二区三区| 成人免费观看的视频黄页| 欧美一区二区三区在线观看| 精品视频在线观看视频免费视频| 久久久久久久免费视频| 国产伦精品一区三区视频| 成人免费福利片在线观看| 韩国毛片 免费| 尤物视频网站在线| 日韩avdvd| 超级乱淫黄漫画免费| 国产一区二区精品久久| 精品视频在线看| 日本在线www| 国产极品精频在线观看| 国产一区免费观看| 欧美激情影院| 欧美a级大片| 亚洲天堂一区二区三区四区| 欧美另类videosbestsex久久| 亚洲天堂在线播放| 你懂的福利视频| 成人在激情在线视频| 高清一级片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产视频一区在线| 免费国产在线视频| 999精品在线| 国产网站免费| 欧美激情一区二区三区中文字幕| 午夜在线影院| 夜夜操网| 久久国产精品永久免费网站| 国产麻豆精品hdvideoss| 美国一区二区三区| 色综合久久天天综合绕观看| 美女被草网站| 欧美激情一区二区三区视频 | 国产精品免费久久| 国产一级生活片| 国产精品1024永久免费视频 | 亚洲天堂一区二区三区四区| 国产极品精频在线观看| 91麻豆精品国产综合久久久| 精品国产一区二区三区久久久蜜臀| 99久久精品国产高清一区二区 | 精品视频在线观看视频免费视频| 欧美a级片视频| 91麻豆精品国产综合久久久| 99热精品在线| 日韩av东京社区男人的天堂| 精品国产香蕉在线播出| 欧美激情一区二区三区在线| 国产网站麻豆精品视频| 亚洲精品影院一区二区| 韩国三级香港三级日本三级| 久久99这里只有精品国产| 午夜欧美福利| 久草免费在线视频| 亚洲爆爽| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 四虎论坛| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 天天色色色| 日韩中文字幕在线播放| 亚洲精品久久久中文字| 日本免费看视频|