在本地開發(fā)時(shí),我們使用 egg-bin dev 來(lái)啟動(dòng)服務(wù),但是在部署應(yīng)用的時(shí)候不可以這樣使用。因?yàn)?nbsp;egg-bin dev 會(huì)針對(duì)本地開發(fā)做很多處理,而生產(chǎn)運(yùn)行需要一個(gè)更加簡(jiǎn)單穩(wěn)定的方式。所以本章主要講解如何部署你的應(yīng)用。
一般從源碼代碼到真正運(yùn)行,我們會(huì)拆分成構(gòu)建和部署兩步,可以做到一次構(gòu)建多次部署。
JavaScript 語(yǔ)言本身不需要編譯的,構(gòu)建過(guò)程主要是下載依賴。但如果使用 TypeScript 或者 Babel 支持 ES6 以上的特性,那就必須要這一步了。
一般安裝依賴會(huì)指定 NODE_ENV=production 或 npm install --production 只安裝 dependencies 的依賴。因?yàn)?devDependencies 中的模塊過(guò)大而且在生產(chǎn)環(huán)境不會(huì)使用,安裝后也可能遇到未知問(wèn)題。
$ cd baseDir |
構(gòu)建完成后打包成 tgz 文件,部署的時(shí)候解壓?jiǎn)?dòng)就可以了。
增加構(gòu)建環(huán)節(jié)才能做到真正的一次構(gòu)建多次部署,理論上代碼沒有改動(dòng)的時(shí)候是不需要再次構(gòu)建的,可以用原來(lái)的包進(jìn)行部署,這有著不少好處:
服務(wù)器需要預(yù)裝 Node.js,框架支持的 Node 版本為 >= 8.0.0。
框架內(nèi)置了 egg-cluster 來(lái)啟動(dòng) Master 進(jìn)程,Master 有足夠的穩(wěn)定性,不再需要使用 pm2 等進(jìn)程守護(hù)模塊。
同時(shí),框架也提供了 egg-scripts 來(lái)支持線上環(huán)境的運(yùn)行和停止。
首先,我們需要把 egg-scripts 模塊作為 dependencies 引入:
$ npm i egg-scripts --save |
添加 npm scripts 到 package.json:
{ |
這樣我們就可以通過(guò) npm start 和 npm stop 命令啟動(dòng)或停止應(yīng)用。
注意:egg-scripts 對(duì) Windows 系統(tǒng)的支持有限,參見 #22。
$ egg-scripts start --port=7001 --daemon --title=egg-server-showcase |
如上示例,支持以下參數(shù):
更多參數(shù)可查看 egg-scripts 和 egg-cluster 文檔。
你也可以在 config.{env}.js 中配置指定啟動(dòng)配置。
// config/config.default.js |
path,port,hostname 均為 server.listen 的參數(shù),egg-scripts 和 egg.startCluster 方法傳入的 port 優(yōu)先級(jí)高于此配置。
$ egg-scripts stop [--title=egg-server] |
該命令將殺死 master 進(jìn)程,并通知 worker 和 agent 優(yōu)雅退出。
支持以下參數(shù):
你也可以直接通過(guò) ps -eo "pid,command" | grep -- "--title=egg-server" 來(lái)找到 master 進(jìn)程,并 kill 掉,無(wú)需 kill -9。
我們還需要對(duì)服務(wù)進(jìn)行性能監(jiān)控,內(nèi)存泄露分析,故障排除等。
業(yè)界常用的有:
注意: Node.js 性能平臺(tái) (alinode) 目前僅支持 macOS 和 Linux,不支持 Windows。
Node.js 性能平臺(tái) 是面向所有 Node.js 應(yīng)用提供 性能監(jiān)控、安全提醒、故障排查、性能優(yōu)化 等服務(wù)的整體性解決方案,提供完善的工具鏈和服務(wù),協(xié)助開發(fā)者快速發(fā)現(xiàn)和定位線上問(wèn)題。
AliNode Runtime 可以直接替換掉 Node.js Runtime,對(duì)應(yīng)版本參見文檔。
全局安裝方式參見文檔。
有時(shí)候,同機(jī)會(huì)部署多個(gè)項(xiàng)目,期望多版本共存時(shí),則可以把 Runtime 安裝到當(dāng)前項(xiàng)目:
$ npm i nodeinstall -g |
nodeinstall 會(huì)把對(duì)應(yīng)版本的 alinode 安裝到項(xiàng)目的 node_modules 目錄下。
注意:打包機(jī)的操作系統(tǒng)和線上系統(tǒng)需保持一致,否則對(duì)應(yīng)的 Runtime 不一定能正常運(yùn)行。
我們提供了 egg-alinode 來(lái)快速接入,無(wú)需安裝 agenthub 等額外的常駐服務(wù)。
安裝依賴:
$ npm i egg-alinode --save |
開啟插件:
// config/plugin.js |
配置:
// config/config.default.js |
npm scripts 配置的 start 指令無(wú)需改變,通過(guò) egg-scripts 即可。
啟動(dòng)命令需使用 npm start,因?yàn)?nbsp;npm scripts 執(zhí)行時(shí)會(huì)把 node_module/.bin 目錄加入 PATH,故會(huì)優(yōu)先使用當(dāng)前項(xiàng)目執(zhí)行的 Node 版本。
啟動(dòng)后會(huì)看到 master 日志包含以下內(nèi)容:
$ [master] node version v8.9.4 |
其中 agent register ok. 表示配置的 egg-alinode 正確連接上了 Node.js 性能平臺(tái)服務(wù)器。
控制臺(tái)地址:https://node.console.aliyun.com
更多建議: