在本地开发时,我们使用 egg-bin dev
来启动服务,但是在部署应用的时候不可以这样使用。因为 egg-bin dev
会针对本地开发做很多处理,而生产运行需要一个更加简单稳定的方式。所以本章主要讲解如何部署你的应用。
一般从源码代码到真正运行,我们会拆分成构建和部署两步,可以做到一次构建多次部署。
JavaScript 语言本身不需要编译的,构建过程主要是下载依赖。但如果使用 TypeScript 或者 Babel 支持 ES6 以上的特性,那就必须要这一步了。
一般安装依赖会指定 NODE_ENV=production
或 npm install --production
只安装 dependencies 的依赖。因为 devDependencies 中的模块过大而且在生产环境不会使用,安装后也可能遇到未知问题。
$ cd baseDir
$ npm install --production
$ tar -zcvf ../release.tgz .
构建完成后打包成 tgz 文件,部署的时候解压启动就可以了。
增加构建环节才能做到真正的一次构建多次部署,理论上代码没有改动的时候是不需要再次构建的,可以用原来的包进行部署,这有着不少好处:
服务器需要预装 Node.js,框架支持的 Node 版本为 >= 8.0.0
。
框架内置了 egg-cluster 来启动 Master 进程,Master 有足够的稳定性。
同时,框架也提供了 egg-scripts 来支持线上环境的运行和停止。
首先,我们需要把 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 系统的支持有限,参见 #22。
安装命令
npm install pm2 -g
让PM2保持最新状态:
pm2 update
在egg项目的根目录定义启动文件:
// server.js
const egg = require('egg');
const workers = Number(process.argv[2] || require('os').cpus().length);
egg.startCluster({
workers,
baseDir: __dirname,
});
这样,我们就可以通过 PM2 进行启动了(本次启动在egg项目的根目录):
pm2 start server.js --name test
检测计算机上可用的init系统并生成配置,使用:
pm2 startup
运行 pm2 startup,即在/etc/init.d/目录下生成pm2-root的启动脚本,且自动将pm2-root设为服务。
查的信息如下
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/home/lxj/.nvm/versions/node/v10.15.1/bin /home/lxj/.nvm/versions/node/v10.15.1/lib/node_modules/pm2/bin/pm2 startup systemd -u lxj --hp /home/lxj
执行上面所查命令
sudo env PATH=$PATH:/home/lxj/.nvm/versions/node/v10.15.1/bin /home/lxj/.nvm/versions/node/v10.15.1/lib/node_modules/pm2/bin/pm2 startup systemd -u lxj --hp /home/lxj
使用NVM时,此pm2路径会在更新Node.js时改变。 每次更新后您都需要运行startup命令。
运行
pm2 save
以此来保存您的进程列表,启动挂钩会自动加载您之前保存的进程列表。
运行 pm2 save,会将当前pm2所运行的应用保存在/root/.pm2/dump.pm2下,当开机重启时,运行pm2-root服务脚本,并且到/root/.pm2/dump.pm2下读取应用并启动。
完成以上命令就能够开机自启动名为test的项目了。
获取egg的压缩包,解压缩替换原有的文件并
pm2 restart test
完成离线更新操作。