使用pm2自动部署Next.js项目

48 min read

先在服务器上实现远程git的免密登陆权限

生成一组SSH密钥

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -C "[email protected]"

将新生产的私钥生效

ssh-agent bash && ssh-add  ~/.ssh/id_rsaexit

将下面命令输出的公钥复制,并配置到远程服务

cat ~/.ssh/id_rsa.pub

实现本地到远程git的免密登陆权限

这个步骤也可以参考上面的教程

实现本地免密登陆远程centos服务器

在使用pm2之前,我们还有一些准备工作。

我们需要将通过上面教程生成的id_rsa.pub来实现本地免密登陆远程Centos服务器

scp ~/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys

username:用户名

127.X.X.X:你的远程ip地址

执行后会输入一次密码,然后显示下面信息,说明配置好了

id_rsa.pub          

pm2简介

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

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

  1. 监听文件变化,自动重启程序
  2. 支持性能监控
  3. 负载均衡
  4. 程序崩溃自动重启
  5. 服务器重新启动时自动重新启动
  6. 自动化部署项目

安装 pm2

npm install -g pm2

使用

在服务器上创建项目文件夹

为了方便管理,我们在新建一个文件夹 /opt/app/halo-xue-react-next(路径建议自定义,这里只是方便演示),进入文件夹,将需要部署的项目 clone 到当前目录。

mkdir /opt/app/halo-xue-react-next

执行了上面的操作后,接下来我们就需要在本地进行操作了

ecosystem.json

然后,我们在本机需要部署的项目中新建文件 ecosystem.json,并写入如下内容。

这是一个格式化输出的代码仅供参考不保证正确性和可用性请根据你的实际情况进行修改和测试

{
  "apps": [
    {
      "name": "halo blog",
      "script": "server.js", // 启动文件位置,需要修改
      "env": {
        "COMMON_VARIABLE": "true"
      },
      "env_production": {
        "NODE_ENV": "production"
      }
    }
  ],
  "deploy": {
    "production": {
      "user": "username", // 服务器用户名,需要修改
      "host": ["123.x.x.x"], // 服务器地址,需要修改
      "ref": "origin/master", // 项目branch,视情况修改
      "repo": "[email protected]", // 项目地址,需要修改
      "path": "/opt/app/halo-xue-react-next", // 当前项目位置,需要修改
      "pre-setup": "rm -rf /opt/app/halo-xue-react-next/source", //需要修改
      "post-deploy":
        "npm install && npm run build && pm2 startOrRestart ecosystem.json --env production", // 可以不修改,建议使用 cnpm 安装
      "ssh_options": "StrictHostKeyChecking=no",
      "env": {
        "NODE_ENV": "production"
      }
    }
  }
}

更多配置参考官网:http://pm2.keymetrics.io/docs/usage/deployment/

提交ecosystem.json

git add ecosystem.jsongit commit -m "Deploy: add ecosystem.json"git push origin master

部署pm2配置

在存在ecosystem.json文件的目录下执行下面命令。

pm2 deploy ecosystem.json production setup

成功的话,会打印如下信息。

img

这一步,如果重复执行会提示:fatal: 目标路径 '/opt/app/react-next-xue/source' 已经存在,并且不是一个空目录。这就只需要将这个目录删除就可以了。 本为有一个很简单的方案:"pre-setup" : "rm -rf /opt/app/halo-xue-react-next/source"这会在每次部署的时候删除source

使用pm2自动部署

在存在ecosystem.json文件的目录下执行下面命令。

pm2 deploy ecosystem.json production

成功的话,会打印如下信息。

img