Egg 應用部署

2020-02-06 14:11 更新

本地開發(fā)時,我們使用 egg-bin dev 來啟動服務,但是在部署應用的時候不可以這樣使用。因為 egg-bin dev 會針對本地開發(fā)做很多處理,而生產運行需要一個更加簡單穩(wěn)定的方式。所以本章主要講解如何部署你的應用。

一般從源碼代碼到真正運行,我們會拆分成構建和部署兩步,可以做到一次構建多次部署。

構建

JavaScript 語言本身不需要編譯的,構建過程主要是下載依賴。但如果使用 TypeScript 或者 Babel 支持 ES6 以上的特性,那就必須要這一步了。

一般安裝依賴會指定 NODE_ENV=production 或 npm install --production 只安裝 dependencies 的依賴。因為 devDependencies 中的模塊過大而且在生產環(huán)境不會使用,安裝后也可能遇到未知問題。

$ cd baseDir
$ npm install --production
$ tar -zcvf ../release.tgz .

構建完成后打包成 tgz 文件,部署的時候解壓啟動就可以了。

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

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

部署

服務器需要預裝 Node.js,框架支持的 Node 版本為 >= 8.0.0。

框架內置了 egg-cluster 來啟動 Master 進程,Master 有足夠的穩(wěn)定性,不再需要使用 pm2 等進程守護模塊。

同時,框架也提供了 egg-scripts 來支持線上環(huán)境的運行和停止。

首先,我們需要把 egg-scripts 模塊作為 dependencies 引入:

$ npm i egg-scripts --save

添加 npm scripts 到 package.json:

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

這樣我們就可以通過 npm start 和 npm stop 命令啟動或停止應用。

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

啟動命令

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

如上示例,支持以下參數:

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

更多參數可查看 egg-scripts 和 egg-cluster 文檔。

啟動配置項

你也可以在 config.{env}.js 中配置指定啟動配置。

// config/config.default.js

exports.cluster = {
listen: {
port: 7001,
hostname: '127.0.0.1', // 不建議設置 hostname 為 '0.0.0.0',它將允許來自外部網絡和來源的連接,請在知曉風險的情況下使用
// path: '/var/run/egg.sock',
}
}

path,port,hostname 均為 server.listen 的參數,egg-scripts 和 egg.startCluster 方法傳入的 port 優(yōu)先級高于此配置。

停止命令

$ egg-scripts stop [--title=egg-server]

該命令將殺死 master 進程,并通知 worker 和 agent 優(yōu)雅退出。

支持以下參數:

  • --title=egg-server 用于殺死指定的 egg 應用,未傳遞則會終止所有的 Egg 應用。

你也可以直接通過 ps -eo "pid,command" | grep -- "--title=egg-server" 來找到 master 進程,并 kill 掉,無需 kill -9。

監(jiān)控

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

業(yè)界常用的有:

Node.js 性能平臺(alinode)

注意: Node.js 性能平臺 (alinode) 目前僅支持 macOS 和 Linux,不支持 Windows。

Node.js 性能平臺 是面向所有 Node.js 應用提供 性能監(jiān)控、安全提醒、故障排查、性能優(yōu)化 等服務的整體性解決方案,提供完善的工具鏈和服務,協(xié)助開發(fā)者快速發(fā)現(xiàn)和定位線上問題。

安裝 Runtime

AliNode Runtime 可以直接替換掉 Node.js Runtime,對應版本參見文檔。

全局安裝方式參見文檔。

有時候,同機會部署多個項目,期望多版本共存時,則可以把 Runtime 安裝到當前項目:

$ npm i nodeinstall -g
$ nodeinstall --install-alinode ^3

nodeinstall 會把對應版本的 alinode 安裝到項目的 node_modules 目錄下。

注意:打包機的操作系統(tǒng)和線上系統(tǒng)需保持一致,否則對應的 Runtime 不一定能正常運行。

安裝及配置

我們提供了 egg-alinode 來快速接入,無需安裝 agenthub 等額外的常駐服務。

安裝依賴:

$ npm i egg-alinode --save

開啟插件:

// config/plugin.js
exports.alinode = {
enable: true,
package: 'egg-alinode',
};

配置:

// config/config.default.js
exports.alinode = {
// 從 `Node.js 性能平臺` 獲取對應的接入參數
appid: '<YOUR_APPID>',
secret: '<YOUR_SECRET>',
};

啟動應用

npm scripts 配置的 start 指令無需改變,通過 egg-scripts 即可。

啟動命令需使用 npm start,因為 npm scripts 執(zhí)行時會把 node_module/.bin 目錄加入 PATH,故會優(yōu)先使用當前項目執(zhí)行的 Node 版本。

啟動后會看到 master 日志包含以下內容:

$ [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 性能平臺服務器。

訪問控制臺

控制臺地址:https://node.console.aliyun.com


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號