PM2 自动化部署项目 之 (Vue SSR)

背景

常规部署项目比较传统的方式通过上传工具直接上传文件替换服务器文件, 也可以通过Xftp 方式来更新/发布指定站点。随着项目复杂度的增强,开发技术等手段增多。一些部署方式显得有点力不从心,且操作过程,失误率很难把控。
本章将基于现在比较流行的一套开发模式(如: VUE + SSR) 输出的项目来了解如何通过PM2 来实现自动化部署我们的站点项目。

== 必须说的一点是:本章重点不在PM2 相关知识,其相关知识及原理将在后续章节中介绍。 这里我假设你对PM2已经有了基本的了解==
如果不了解可以先跳到这篇文章了解其内关于pm2的相关简介: vue 服务端部署

另外: 我这里用的是阿里云 CentOS 7.4 64位

PM2 简介

pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。

使用pm2管理的node程序的好处

MP2自动部署实践

pm2 自动部署主要流程我概括为如下几点:

  • 服务端SSH关联部署项目的git 仓库 (无密获取git仓库代码)
  • 本地机器SSH关联到远程服务器 (无密连接部署服务器)
  • 通过pm2 在项目根目录下生成 ecosystem.config 部署相关配置文件
  • 本地提交代码至git 仓库并通过pm2 命令实现自动部署

下面我开始针对如上几点一一分析讲解

服务端SSH关联部署项目的git 仓库

我们都知道,开发过程中我们需要从git 仓库中先clone 代码到本地。git clone/pull/push 有个特点: https 模式下每次获取代码都需要校验账号及密码。 这比较麻烦,所以我们可以通过SSH 方式来建立本地与git 仓库之间公/私钥鉴权验证来解决这个问题。 即通过:ssh-keygen 命令生成公钥/私钥文件。 具体的生成过程看这篇文章 Git SSH 之 公钥/私钥

==这里我假设你已经知道如何生成SSH KEY ==

生成ssh key 后, 可以通过如下命令来输出公钥到命令控制台:

cat ~/.ssh/id_rsa.pub

然后复制粘贴到github 添加公钥-> 公钥 即可。 这里我用的是码云 gitee, 用起来都是一样的,只是它运行个人拥有多个私人项目。
图1 生成ssh key
在这里插入图片描述
图2: 输出公钥到命令行:

在这里插入图片描述

本地机器SSH关联到远程服务器

这里简单补一下 ssh key 的工作原理
在这里插入图片描述
: ssh key通过ssh-keygen命令生成公钥文件和私玥文件,私玥存本地,不告诉其他人。把公钥放到需要认证的服务器。然后通过ssh登录,会进行公私钥认证。匹配成功即实现无密码登录。

  • 本机生成ssh key 命令:

// 一路 ‘回车‘ 到生成即可
ssh-keygen -t rsa  -C "xxxxx@xxx.com"  (xxxx 为自己在git中注册的邮箱)

  • 如何快速将本地生成的id_rsa.pub(公钥) 拷贝到远程服务器指定键值内

本地通过 cmd 命令行:

// ~ : 表示公钥路径, 直接这么写就行, 系统会识别并查找到这个路径
// root:为你远程服务器登录名
// @xxxxx:后面的xxx 为你远程服务器的对公IP

scp ~/.ssh/id_rsa.pub root@47.98.154.75:/root/.ssh/authorized_keys

如上命令输入回车后,如果成功通过ssh 连接远程服务器发现不在提示输入密码, 直接连接成功。(如: ssh root@xx.xx.xxx.xxx )

图3: 拷贝公钥至远程服务器在这里插入图片描述

通过pm2 在项目根目录下生成 ecosystem.config 部署相关配置文件

  • cmd 定位到项目根下 输入(请确保已全局安装了 pm2):
pm2 ecosystem

根目录下自动创建 ecosystem.config.js 文件。
内容如下:

module.exports = {
  apps : [{
    name: 'package.json 对应name', //也可自己起一个
    script: 'public',  // 这里你的build 输出目录

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    // 环境变量
    env: {  
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],
 // 重点
  deploy : {
    production : {
      user : 'root',  // 远程服务器登录名
      host : 'xx.xx.222.131',  // 远程服务器对公 IP
      ref  : 'origin/master', // 部署的分支
      repo : 'git@gitee.com:chenzhizhuo/projectName.git',  // 这里是你的ssh 仓库地址
      path : '/root/projects/production', // 项目部署的路径(也是git clone 路径)
      // 如果你需要在部署服务器上build 可以添加 & npm run build 命令 (我是本地构建好一起提交到git,减轻服务端内存不足等问题)
      'post-deploy' : 'npm install && pm2 reload pm2.yml --env production'  // 这里pm2 远程部署指令  (pm2.yml 为pm2的启动配置文件)
    }
  }
};

这里顺便贴一下我的 pm2.yml 文件源码:

apps:
  - script: ./server/server.js // 服务端启动及数据/模板生成等逻辑实现
    name: vue_xxxx_mobile // 这里最好对应你的package.json 中的name名称
    env_production:
      NODE_ENV: production  // 启动后服务端注入的环境变量
      HOST: localhost // 本地ip/localhost
      PORT: 7788  // 启动服务监听的端口

本地提交代码至git 仓库并通过pm2 命令实现自动部署

注: 建议通过git base 来执行pm2 部署相关命令。 其它工具部分会出现位置异常。

  • 部署前请确保你已提交了本地修改到git 仓库
  • 自动部署命令:

// 首次部署先执行该命令(拉去git 代码)
pm2 deploy ecosystem.config.js production setup 

//  非首次/首次上一命令已执行完 则执行改命令(真正执行 ecosystem.config中的 post-deploy命令)
//   执行命令每次部署服务器都会拉取最新git 代码然后依次执行 ecosystem.config中的 post-deploy命令
pm2 deploy ecosystem.config.js production(再次部署:执行安装及pm2启动)

注: 因为我的项目是本地打包好一起将打包文件build 到git, 所以不需要再部署服务器重新build 。

  • 自动部署过程可能遇到的错误
    错误如:git clone 没有权限; deploy Host key verification failed
    在这里插入图片描述
    解决办法 (重点)
    此问题主要是在远程服务器中,并未将http://github.com加入known_hosts。
    在服务器端通过如下命令设置:
    如果代码是放在码云上面 则 应该将 gitee.com 加入known_host,在服务器通过如下命令设置:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
ssh-keyscan -t rsa gitee.com >> ~/.ssh/known_hosts   // 码云gitHub

注: 如上两个命令在远程服务器上执行; 执行完成后可以尝试重启一下你服务器,重启后再执行一次部署命令。

图4 : 自动部署成功:
在这里插入图片描述

到这里pm2 自动化部署项目就告一段落了。 后续会继续分享文章开头提到的pm2 好处/有点 的其它项分享~
文章中如有错误的地方,可回复留言一起讨论。 谢谢!

最后, *如果觉得本文章对你有帮助,记得点赞支持哟! *

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值