Egg 應(yīng)用部署

2020-02-06 14:11 更新

本地開發(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)建多次部署。

構(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
$ npm install --production
$ tar -zcvf ../release.tgz .

構(gòu)建完成后打包成 tgz 文件,部署的時(shí)候解壓?jiǎn)?dòng)就可以了。

增加構(gòu)建環(huán)節(jié)才能做到真正的一次構(gòu)建多次部署,理論上代碼沒有改動(dòng)的時(shí)候是不需要再次構(gòu)建的,可以用原來(lái)的包進(jìn)行部署,這有著不少好處:

  • 構(gòu)建依賴的環(huán)境和運(yùn)行時(shí)是有差異的,所以不要污染運(yùn)行時(shí)環(huán)境。
  • 可以減少發(fā)布的時(shí)間,而且易回滾,只需要把原來(lái)的包重新啟動(dòng)即可。

部署

服務(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:

{
"scripts": {
"start": "egg-scripts start --daemon",
"stop": "egg-scripts stop"
}
}

這樣我們就可以通過(guò) npm start 和 npm stop 命令啟動(dòng)或停止應(yīng)用。

注意:egg-scripts 對(duì) Windows 系統(tǒng)的支持有限,參見 #22。

啟動(dòng)命令

$ egg-scripts start --port=7001 --daemon --title=egg-server-showcase

如上示例,支持以下參數(shù):

  • --port=7001 端口號(hào),默認(rèn)會(huì)讀取環(huán)境變量 process.env.PORT,如未傳遞將使用框架內(nèi)置端口 7001。
  • --daemon 是否允許在后臺(tái)模式,無(wú)需 nohup。若使用 Docker 建議直接前臺(tái)運(yùn)行。
  • --env=prod 框架運(yùn)行環(huán)境,默認(rèn)會(huì)讀取環(huán)境變量 process.env.EGG_SERVER_ENV, 如未傳遞將使用框架內(nèi)置環(huán)境 prod。
  • --workers=2 框架 worker 線程數(shù),默認(rèn)會(huì)創(chuàng)建和 CPU 核數(shù)相當(dāng)?shù)?app worker 數(shù),可以充分的利用 CPU 資源。
  • --title=egg-server-showcase 用于方便 ps 進(jìn)程時(shí) grep 用,默認(rèn)為 egg-server-${appname}。
  • --framework=yadan 如果應(yīng)用使用了自定義框架,可以配置 package.json 的 egg.framework 或指定該參數(shù)。
  • --ignore-stderr 忽略啟動(dòng)期的報(bào)錯(cuò)。
  • --https.key 指定 HTTPS 所需密鑰文件的完整路徑。
  • --https.cert 指定 HTTPS 所需證書文件的完整路徑。
  • 所有 egg-cluster 的 Options 都支持透?jìng)鳎?nbsp;--port 等。

更多參數(shù)可查看 egg-scripts 和 egg-cluster 文檔。

啟動(dòng)配置項(xiàng)

你也可以在 config.{env}.js 中配置指定啟動(dòng)配置。

// config/config.default.js

exports.cluster = {
listen: {
port: 7001,
hostname: '127.0.0.1', // 不建議設(shè)置 hostname 為 '0.0.0.0',它將允許來(lái)自外部網(wǎng)絡(luò)和來(lái)源的連接,請(qǐng)?jiān)谥獣燥L(fēng)險(xiǎn)的情況下使用
// path: '/var/run/egg.sock',
}
}

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ù):

  • --title=egg-server 用于殺死指定的 egg 應(yīng)用,未傳遞則會(huì)終止所有的 Egg 應(yīng)用。

你也可以直接通過(guò) ps -eo "pid,command" | grep -- "--title=egg-server" 來(lái)找到 master 進(jìn)程,并 kill 掉,無(wú)需 kill -9。

監(jiān)控

我們還需要對(duì)服務(wù)進(jìn)行性能監(jiān)控,內(nèi)存泄露分析,故障排除等。

業(yè)界常用的有:

Node.js 性能平臺(tái)(alinode)

注意: 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)題。

安裝 Runtime

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 --install-alinode ^3

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
exports.alinode = {
enable: true,
package: 'egg-alinode',
};

配置:

// config/config.default.js
exports.alinode = {
// 從 `Node.js 性能平臺(tái)` 獲取對(duì)應(yīng)的接入?yún)?shù)
appid: '<YOUR_APPID>',
secret: '<YOUR_SECRET>',
};

啟動(dòng)應(yīng)用

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
$ [master] alinode version v3.8.4
$ [Tue Aug 06 2019 15:54:25 GMT+0800 (China Standard Time)] Connecting to wss://agentserver.node.aliyun.com:8080...
$ [Tue Aug 06 2019 15:54:26 GMT+0800 (China Standard Time)] agent register ok.

其中 agent register ok. 表示配置的 egg-alinode 正確連接上了 Node.js 性能平臺(tái)服務(wù)器。

訪問(wèn)控制臺(tái)

控制臺(tái)地址:https://node.console.aliyun.com


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)