PM2 的代码自动发布依赖 GitHub 或相似功能的网站,因此须要先在 GitHub 上添加我的电脑和远程服务器的 SSH 秘钥。javascript
大致流程以下( Mac 和 Linux 系列的系统直接在终端中执行指令,Windows 须要先安装 Git 客户端):java
Hi XXX! You've successfully authenticated, but GitHub does not provide shell access.
要注意,本身的我的电脑和远程服务器都要作这一整套操做,这样才可以在本机发布代码到 GitHub 上以后,再让远程服务器把最新的代码更新过去。node
在本机和服务器都全局安装 PM2,用 npm
或 yarn
都可,若是下载速度慢,记得先切换成淘宝的 npm 源。git
注意,若是两边电脑上的 Git 不是最新版,务必更新到最新版。否则可能有代码没法及时同步的问题,服务器始终没法 pull 到最新版本的代码,很闹心。当前的最新版是 2.16.3 版本,2018 年 3 月 22 号发布。github
在本机的终端环境中,用 pm2 ecosystem
命令生成一份原始的 PM2 配置文件 ecosystem.confi.js
。注意,官网文档和实际操做的结果不一致,文档上说执行这个命令会生成 ecosystem.json
这个文件,但本身操做的时候并非这样,你们也要注意一下。web
为了方便你们参考,把本身修改后的配置文件内容贴了上来,只贴了重要的部分,别的地方根据本身的须要修改。shell
module.exports = { apps : [ // 目前只用 PM2 管理一个项目,因此这里删除了多余的内容 { name : 'RMS', // 这里是项目的启动文件,不过本身没用上 script : './dist/bin/www', env: { COMMON_VARIABLE: 'true' }, env_production : { NODE_ENV: 'dev' } } ], // 部署环境的设置,本身只用到了开发环境,须要修改完代码以后马上看到结果,因此就没有生产环境的配置 deploy : { dev : { // 服务器上进行平常操做的用户 user : 'www', // 服务器的 IP host : '1.2.3.4', ref : 'origin/master', repo : 'git@github.com:Dream4ever/rms.git', // 项目要部署到服务器上的位置,PM2 默认会部署到该路径的 source 子文件夹下 path : '/home/www/websites/rms', // 服务器下载到最新的代码以后要执行的命令,把 npm 命令改为了 yarn 'post-deploy' : 'yarn && pm2 reload ecosystem.config.js --env dev', env : { NODE_ENV: 'dev' } } } };
配置完成以后,就要开始把项目经过 PM2 自动部署到服务器上了。npm
这里有一点要注意:须要先把本机项目的最新版,也就是保存并提交了全部修改的版本发布到 GitHub 上去,而后再进行后面的部署操做。json
若是以前没有经过 SSH 链接过服务器,就须要先在本机执行 ssh-copy-id www@1.2.3.4
这个命令(www
是前面配置的服务器的用户,@
后面是 IP),把本机的 SSH 秘钥信息添加到服务器上,这个配置成功以后,之后就不须要再执行这条 SSH 命令了。windows
而后在本机初始化远程服务器上的项目:pm2 deploy ecosystem.confi.js dev setup
。命令中的 dev
指的是在上面配置文件中写的部署环境的名称,对于同时须要设置开发和生产环境的状况,就根据本身须要初始化两次吧,没这个需求的就不用管了。
接着就是部署项目,通俗地说,也就是通知服务器把前面从本机 push 到 GitHub 上的最新代码下载下来:pm2 deploy ecosystem.confi.js dev
。
在这两个过程当中,均可以看到服务器上的操做指令和结果都显示到本机的终端上了。
通常没什么问题的话,通过这几步操做,就能部署成功了。
若是部署的是 Node.js 服务,固然还须要把它启动起来才行。一种方式就是经过 PM2 的 exec
指令让远程服务器执行指定的命令,另外一种方式则是直接 SSH 登陆到服务器上执命令,各取所好吧。
若是在本机执行,就用这种方式:pm2 deploy production exec "pm2 start ./api/bin/www
。若是登陆到服务器上执行的话,就直接执行 pm2 start ./api/bin/www
就行了。
对于在本机用 ES6 语法写代码的同窗,有一点要注意。由于本身在本机用的是 babel-preset
,可是这一套指令不知道怎么让它在服务器上运行,因此用了 PM2 官网提供的方法,就是用 --interpreter babel-node
这个参数来执行。
pm2 deploy production exec "pm2 start ./api/bin/www --interpreter babel-node"
官网还提供了另外一种方法,是 PM2 做者我的比较喜欢的方式。就是用一个入口文件经过 require()
命令引用本来的入口文件,虽然会影响性能,可是也有它的好处。
文档的地址:Using transpilers with PM2。
先列出官网提供的 CheatSheet,能够用来速查。
本身在使用 PM2 的时候,有几个经常使用的命令:
pm2 start xx.js --watch
,以监控模式启动项目,这样就能和 nodemon、supervisor 同样,在最新版的代码部署到服务器以后,自动重启服务。
这个 pm2 start
命令有一点须要注意:在第一次用它启动某个项目的时候,若是没有用 --name
为项目指定名称,在启动项目以后能够看到 PM2 本身为项目指定了一个名称,就是下面表格中的 Name
所对应的字段。以后再次启动项目的时候,就能够直接用 pm2 start www
启动项目了,也就是经过项目名称启动。
┌──────┬──────┬─────────┬───┬─────┬────────┐ │ Name │ mode │ status │ ↺ │ cpu │ memory │ ├──────┼──────┼─────────┼───┼─────┼────────┤ │ www │ fork │ stopped │ 0 │ 0% │ 0 B │ └──────┴──────┴─────────┴───┴─────┴────────┘
pm2 list
则会列出经过 PM2 来管理的全部项目的概况,也就是上面的这个表格。
还有就是 pm2 monit
,用来在终端监控服务的运行状况。
┌─ Process list ───────┐┌─ Global Logs ────────────────────────────────────────┐ │[ 0] www Mem: ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ │ ││ │ └──────────────────────┘└──────────────────────────────────────────────────────┘ ┌─ Custom metrics ─┐┌─ Metadata ───────────────────────────────────────────┐ │ (http://bit.ly/code- ││ App Name www │ │ metrics) ││ Restarts 0 │ │ ││ Uptime 0 │ │ ││ Script path /Users/samsara/Code/rms/api/b │ └──────────────────────┘└──────────────────────────────────────────────────────┘ left/right: switch boards | up/down/mouse: scroll | Ctrl-C: exit To go
另外还有一个指令就是 pm2 logs app
,用来查看 app
这个项目的日志。若是只是执行 pm2 logs
的话,就会显示全部项目的日志,看着会比较乱。
好了,文档到这里就结束了,感兴趣的话,就快试试吧!