用PM2一键部署你的Node项目
写在前面
之前在部署项目的时候,先将项目push到私有仓库里,然后再在服务器下clone项目,然后再部署。开始的时候觉得也还行,后来随着项目更新速度有点快,于是部署的时候就各种窗口切换,各种指令啪啪啪的输入,可爱的室友便开始嫌我烦(我也嫌烦),于是找到PM2这个神器。
什么是PM2?
当然不可以吃,但是能省出时间让你吃吃吃,也就是提升了我们的部署效率,我们用一张图来看看之前我是怎么部署迭代项目的:

当你有个很皮的项目需要不断迭代更新的时候,那么每次迭代都要经历这么一个过程,当然是不能忍的呀~,如果我们用PM2快速部署的话,那么将会是下面这个样子的:

惊不惊喜,意不意外,是不是很想学会怎么做到的,接着往下看吧~
PM2部署前提条件
- 首先你得有一个配置好了node基本环境服务器,并且你能通过ssh无钥登录你的服务器,如果还未满足此条件,可以看一下我的上一篇文章。
- 你的服务器和你的电脑能通过ssh访问你的gitee或者github的仓库,如果的项目不想被公开,那么可以放在gitee的免费私有仓库上,当然也可以花钱在github上建私有仓库。
- 在电脑和服务器下已全局安装PM2
- 一颗能够通过Google解决以上三个问题的大脑
PM2部署步骤
创建项目
- 为了更好的说明整个步骤,我们现在gitee上创建一个仓库叫
Pm2Test,并且设为私有仓库,其实都可以的,只是正式上线的项目一般都是私有的,然后通过本地ssh无钥clone下来。

- 创建
aap.js,设置一个在3004端口下监听的demo:
1 | const http = require('http'); |
- 重点是在根目录下创建PM2的配置文件
ecosystem.json,我们在代码注释中解释每一个选项是啥意思和改怎么填写,注意在粘贴到项目中需要将注释都去掉,json是不解释注释的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26{
"apps": [
{
"name":"Pm2Test", //项目名称
"script":"app.js", //项目入口文件
"env": {
"COMMON_VARIABLE": "true"
},
"env_production":{
"NODE_ENV": "Pm2Test"
}
}
],
"deploy": {
"Pm2Test": {
"user": "vince", //登录服务器的user账号
"host": ["59.110.159.146"], //登录服务器的公网ip地址
"ref": "origin/master", //远端名称及分支名
"repo": "git@gitee.com:vinceHua/Pm2Test.git", //git仓库地址也就是这个项目的仓库地址
"path": "/home/vince/www/production", //远程服务器部署目录,需要填写user具备写入权限的目录
"ssh_options": "StrictHostKeyChecking=no", //ssh检查设置
//部署后执行的命令
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"
}
}
}
提交项目到仓库
项目文件和pm2配置文件完成后,我们需要将最新修改的这个项目push到gitee上
将项目拉取到服务器上
然后我们通过pm2操控服务器将gitee上的文件拉取到服务器上,键入pm2 deploy ecosystem.json Pm2Test setup,Pm2Test对应着配置文件中deploy下的项目,回车如图便是成功了:

将项目运行起来
- 然后输入
pm2 deploy ecosystem.json Pm2Test让项目运行起来,这个时候我们发现如图错误,原因是在服务器下的bash并不能通过远程执行pm2指令。

- 解决办法是在服务器的账户目录下输入
vi .bashrc将如下图的标注的注释掉(在前面加#),如图

- 再次运行
pm2 deploy ecosystem.json Pm2Test,如下图即表示成功了:

- 浏览器下访问59.110.159.146:3004,便部署成功啦~

项目更新
- 当项目有修改的时候,我们只需要执行一下命令将代码push到gitee中:
git add .it commit -m 'test'git push -u origin master
- 然后输入一下命令再次让项目运行起来
pm2 deploy ecosystem.json Pm2Test
- 再次访问59.110.159.146:3004,发现项目已经更新了:

PM2帮我们做了哪些事情?
配置文件说起
1 | "user": "vince", //登录服务器的user账号 |
分析以上代码:
- 我们设置了服务器的user和host,并且本地local能够用ssh无钥登录服务器,这样PM2也就能连接到我们服务器
- ref和repo设置了gitee下的仓库地址和分支,并且服务器server能够无钥拉取gitee私有仓库下的项目,这样PM2就在服务器下替我们拉取了gitee下的项目。
- 设置path后,PM2将拉取的项目存到设置的path下
- post-deploy让PM2替我们执行哪些代码
拉取项目时候键入pm2 deploy ecosystem.json Pm2Test setup时候,我们可以在log下看到拉取项目的整个流程

运行项目键入pm2 deploy ecosystem.json Pm2Test时候,我们观察下图便会发现整个运行post-deploy的过程

总结
通过一步步的实践,我们学习到PM2的部署过程和真个部署的原理。PM2的主要功能就是省去了我们登录服务器拉取部署这个繁杂的过程,所有的操作都能在本机电脑上进行。