使用pm2与git仓库部署Node应用

背景

近几日将公司项目开了一个新坑,使用Nodejs进行服务端渲染,为公司团队前后端分离往前推进了一大步,本文就介绍了如何将开发好的Node程序在服务器上完成高逼格自动化部署

技术架构

  • 开发环境:MacOS 10.13
  • 程序:Koa+requirejs
  • 服务器:公司内网服务器 Centos6.8
  • 代码托管:公司内部gitlab
  • 程序端口:3000端口 使用pm2进行托管部署

服务器环境初始化

接下来以公司服务器系统Centos6.8为例进行说明:
服务器上需要安装以下程序和依赖

  • Nodejs (项目中运用了大量的ES6,ES7语法,所以我们安装是7.9以上版本)
  • NPM
  • PM2 npm install pm2 -g
  • Git yum install git

连接服务器

作为一名极客,我推荐使用ssh命令行连接服务器
ssh -p 2222 root@212.22.2.22
(放弃吧,上面的地址是假的,你们连不进去的)

安装nodejs

这里我推荐使用nvm进行服务器上node版本管理
使用命令
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash

安装完成之后将nvm写进系统环境变量中,分别执行
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

使用如下命令安装7.9.0版本的nodejs
nvm install 7.9.0

安装完成之后会自动切换成7.9.0版本,如果没有切换,可以使用
nvm use 7.9.0
具体使用方法请看文末参考文章。

tips:安装完nvm之后,可能会发现nvm没有生效,这时退出服务器连接再进入就行了

安装pm2

由于国内网络不可抗力因素,通常我们安装npm包都很慢,这里推荐切换成淘宝源来安装
此处安利神器nrm 这是一个管理你本地npm源的工具,超级好用

首先安装nrm
npm install nrm --registry=https://registry.npm.taobao.org

安装成功后,使用命令
nrm ls 看到如下界面:

nrm 列表

使用nrm use taobao 选择淘宝源,然后你就可以放肆地下载各种npm包了。

输入npm install pm2 -g 安装pm2

服务器初始环境就暂时告一段落,接下来我们回到本地的配置上来。

安装Git

使用yum install git 进行git的安装
这里推荐阿里云的镜像

配置Git私钥

使用ssh-keygen~/.ssh下生成密钥id_rsa,将生成的id_rsa.pub文件复制到git仓库的ssh-key配置页面中

本地程序配置

本地同样要有nodejs,npm,pm2,安装方式和服务器上的一样,这里就不过多赘述。

本文是基于程序代码托管在git上,换句话说就是使用git进行版本控制的,所以本文所述内容不适合svn用户。

使用pm2的ecosystem

终端打开本地程序根目录地址,输入pm2 ecosystem,会在你本地生成一个ecosystem.config.js,参照官方文档,我们的配置如下,仅供参考:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
module.exports = {
apps: [
{
name: 'app',
script: './bin/www',
env: {
COMMON_VARIABLE: 'true'
},
env_production: {
NODE_ENV: 'production'
}
},
],
deploy: {
production: {
user: 'root',//服务器用户名
host: '22.22.222.22',//服务器地址
port: '4922',//服务器连接端口号,默认不写为22
ref: 'origin/master',//发布的分支版本
repo: 'git@xxx.top:front-end/scapp.git',//仓库地址
path: '/home/wwwroot/scapp',//发布的服务器文件位置
'post-deploy': 'npm install --production && pm2 reload ecosystem.config.js --env production',//部署后需要执行的命令
env: {
NODE_ENV: 'production'
}
},
dev: {
user: 'root',
host: '22.22.222.22',
port: '4922',
ref: 'origin/master',
repo: 'git@xxx.top:front-end/scapp.git',
path: '/home/wwwroot/scapp',
'post-deploy': 'npm install --production && pm2 reload ecosystem.config.js --env dev',
env: {
NODE_ENV: 'dev'
}
}
}
};

因为pm2的部署是通过ssh进行的,因此需要开通本地到远程服务器的无密码登录,同样,在Mac下,通过ssh-keygen生成RSA公钥,并拷贝到远程服务器:
scp -P 4922 ~/.ssh/id_rsa.pub root@22.222.22.22:/root/.ssh/authorized_keys

这一步很关键,测试成功的方式就是你通过ssh连接服务器,不用再输入密码了,这里面有不少坑,具体等待各位自己踩坑。

回到本地应用目录,执行命令:
pm2 deploy ecosystem.json production setup

成功会提示success,如果失败,提示Host key verification failed. 就是没有将你的git仓库加进known_hosts中,在服务器中,注意,在服务器中执行命令:
ssh-keyscan -t rsa 你的git仓库地址 >> ~/.ssh/known_hosts

加入成功之后,回到本地继续执行:
pm2 deploy ecosystem.json production setup

这里的production对应的就是刚才的配置文件中的deploy字段下面的属性。配置文件中我写了production和dev,这里我们使用了production进行发布示例。

不出意外,成功之后提示

○ setup complete
–> Success

项目部署

代码提交

这一步很重要,发布之前必须保证git的代码与你本地的保持一致。

代码发布

在本地程序根目录下输入:
pm2 deploy ecosystem.json production

等待服务器上npm的安装,代码的更新,成功之后看到的应该是如下:

发布成功

至此,我们的程序发布成功。

在服务器上输入命令pm2 list查看程序运行的状况
运行状况

参考文章

HyruleTeam wechat
前端手艺工坊