如何更快速便捷地部署你的应用?

写在前面

之前在部署项目的时候,先将项目push到私有仓库里,然后再在服务器下clone项目,然后再部署。开始的时候觉得也还行,后来随着项目更新速度有点快,于是部署的时候就各种窗口切换,各种指令啪啪啪的输入,可爱的室友便开始嫌我烦(我也嫌烦),于是找到PM2这个神器。

什么是PM2?

当然不可以吃,但是能省出时间让你吃吃吃,也就是提升了我们的部署效率,我们用一张图来看看之前我是怎么部署迭代项目的:

image

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

image

惊不惊喜,意不意外,是不是很想学会怎么做到的,接着往下看吧~

PM2部署前提条件

  1. 首先你得有一个配置好了node基本环境服务器,并且你能通过ssh无钥登录你的服务器,如果还未满足此条件,可以看一下我的上一篇文章。
  2. 你的服务器和你的电脑能通过ssh访问你的gitee或者github的仓库,如果的项目不想被公开,那么可以放在gitee的免费私有仓库上,当然也可以花钱在github上建私有仓库。
  3. 在电脑和服务器下已全局安装PM2
  4. 一颗能够通过Google解决以上三个问题的大脑

PM2部署步骤

创建项目

  1. 为了更好的说明整个步骤,我们现在gitee上创建一个仓库叫Pm2Test,并且设为私有仓库,其实都可以的,只是正式上线的项目一般都是私有的,然后通过本地ssh无钥clone下来。

image

  1. 创建aap.js,设置一个在3004端口下监听的demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const http = require('http');

const homePage=`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Nice to meet you ~</h1>
</body>
</html>
`

http.createServer((req,res) => {
res.statusCode = 200;
res.setHeader('Content-Type','text/html')
res.end(homePage)
})
.listen(3004,()=>{
console.log('Server Runing At 3004')
})
  1. 重点是在根目录下创建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下的项目,回车如图便是成功了:

image

将项目运行起来

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

image

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

image

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

image

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

image

项目更新

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

image

PM2帮我们做了哪些事情?

配置文件说起

1
2
3
4
5
6
7
"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具备写入权限的目录
//部署后执行的命令
"post-deploy": "npm install && pm2 startOrRestart ecosystem.json --env production"

分析以上代码:

  • 我们设置了服务器的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下看到拉取项目的整个流程

image

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

image

总结

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