nestjs-使用pm2更新部署到服务器

前言

我们都开发完了,也做了后台,那肯定也要部署到服务器,否则客户端怎么对接口是吧,就算有运维,我们最好也要掌握一门技能,不然有时候确实挺难受

常见的部署服务的 pm2、docker、k8s等,这里只讲解 pm2,只因为好用稳定,我们小后台必备(大的没有专业的运维或者更专业的工具还是差点意思)

部分参考自 这里

配置pm2基础环境

这里就配置我们常用的 brew、nvm、git、node、npm、yarn、pm2

安装 nvm

js 复制代码
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

下载 homebrew,这是一个仓库,里面有很多我们想要的内容,对于一些自导 yum,也可以直接使用yum

js 复制代码
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

下载完毕 homebrew 就可以很方便下载其他了

下载 node

js 复制代码
//自动安装稳定版本
brew install node

安装 git,可以到 这里 下载,也可以用 brew,我们可以在我们的服务器使用 git 拉去我们的项目,然后运行,配置 ssh 可以帮助我们更方便的拉取

js 复制代码
brew install git

下载 pm2,pm2 是 node 编写的多进程管理器,我们就用 PM2 托管我们的服务即可,用 npm 下载 pm2 即可

js 复制代码
//下载到全局
npm install pm2@latest -g

//如果有 yarn,则可以
yarn global add pm2

使用下载 yarn,就可以使用 yarn 环境了

js 复制代码
npm install yarn -g

pm2部署服务器

前面说了,pm2 是 node 编写的一个多进程托管工具,其能托管我们的服务,保证其进程持续活着,无论是测试还是生产都是非常好用的

pm2 文档

js 复制代码
//首先进入服务器,更换远端服务器ip,然后输入密码即可
ssh root@47.95.7.29

下面就是执行 pm2 命令的环节了

启动服务

js 复制代码
//启动我们的项目,其中main.js为我们项目的入口文件,默认单进程启动
pm2 start main.js

//命名我们的服务,方便查看,不然就是main了
pm2 start main.js --name my-server

//添加监听,当我们的项目发生改变时,自动重新启动
pm2 start main.js --watch

//启动多进程,充分利用多核服务器资源,一般集群用,数据写入安全的需要额外注意了
pm2 start main.js -i 2
pm2 start main.js -i max //max为cpu核心数量

//我们可以通过进程 id、name 来启动暂停的服务
pm2 start id
pm2 start my-server

暂停服务

js 复制代码
//我们可以通过进程 id、name 来暂停的服务
pm2 stop id
pm2 stop my-server
pm2 stop all //停止所有服务

删除服务

js 复制代码
//我们可以通过进程 id、name 来删除的服务
pm2 delete id
pm2 delete my-server
pm2 delete all //停止所有服务

重启服务

js 复制代码
//我们可以通过进程 id、name 来重启服务,相当于先暂停后启动两个操作
pm2 restart id
pm2 restart my-server
pm2 restart all //重启所有服务

重新加载服务

js 复制代码
//我们可以通过进程 id、name 来重新加载服务,相当于先删除后启动两个操作
pm2 reload id
pm2 reload my-server
pm2 reload all //重启加载服务

查看、监控服务

js 复制代码
//查看我们运行的所有服务
pm2 list

//查看实时日志
pm2 logs

//清空所有日志文件
pm2 flush

//监控我们的服务,有错误会显示出来
pm2 monit

帮助

js 复制代码
//当忘记或者想查看pm2的命令时,可以使用 --help 来查看
pm2 --help

开机自启

设置开机自启

js 复制代码
//输入下面命令可以设置开机自启
pm2 startup

//设置失败时,会给出提示,我们将提示内容粘贴到终端运行即可
[PM2] You have to run this command as root。Execute the following command:  
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 startup <distribution>

//直接沾过来运行即可
sudo su -c "env PATH=$PATH:/home/unitech/.nvm/versions/node/v14.3/bin pm2 startup <distribution> -u <user> --hp <home-path>

//启动所有所需的应用程序后,保存应用程序列表,以便在重新启动后重新生成
pm2 save

//要手动恢复以前保存的进程(借助于 `pm2 save`)
pm2 resurrect

//禁止开机启动,删除启动配置
pm2 unstartup

配置脚本和环境变量

项目根目录创建 ecosystem.config.js文件

js 复制代码
//使用这个命令会自行创建一个
pm2 ecosystem

运行时直接 pm2 start ecosystem.config.js 即可

下面简单讲讲如何配置,更详细的请查看 这里

js 复制代码
{
  "apps" : [
    {
      "name"      : "my-server",  //服务名字
      "script"  : "./dist/main.js", //执行脚本
      "instances": 4, //核心数 "max" 则为全部
      //启动应用程序的模式,可以是"cluster"或"fork",默认fork
      "exec_mode": "cluster",
      //启用监视和重启功能,如果文件夹或子文件夹中的文件发生更改,您的应用程序将重新加载
      //不能单纯的设置为true,易导致无限重启,无论是上传还是日志,都会造成不好影响
      //"watch": ["dist"],
      "ignore_watch": [// 可以设置不用监听的文件
        "node_modules",
        "public",
        "logs"
      ],
      //分钟 (0-59)、小时 (0-23)、一个月中的第几天 (1-31)、月份 (1-12) 、星期几 (0-6) (星期天 为0)
      //设置定时重启,具体可以看文档,一般用来解决重启能解决的问题
      //例如:老程序内存泄露,一定时间会爆内存,但程序员跑路了,为了保持稳定运行只能重启
      "cron_restart": '0 0 * * *',
      // 启用/禁用应用程序崩溃或退出时自动重启,默认为true, 发生异常的情况下自动重启
      "autorestart": true,
      // 设置应用程序异常退出重启的次数,默认15次(从0开始计数),最大异常重启次数,即小于min_uptime运行时间重启次数;
      max_restarts: 10,
      // 启用/禁用应用程序崩溃或退出时自动重启,默认为true, 发生异常的情况下自动重启
      autorestart: true,
      //启动应用程序的目录,一般不需要,如果要在一处维护项目,那么这个是需要的
      "cwd" : "/root/my-server/", 
      //设置日志路径,可以方便我们查看一些错误原因或者其他信息
      "error_file" : "./log/err.log",
      "out_file" : "./log/out.log",
      "log_date_format":"YYYY-MM-DD HH:mm Z" //日期格式
      //集群状态下合并日志
      merge_logs: true, 
      //环境变量,我们前面的 .env 服务端会被忽略,可以注入这里面的环境变量,可以避免正式服务器信息泄露
      //pm2 start process.json --env production,可以选择环境变量
      "env": {
        "HOST": "192.168.1.1", //出现在程序的host环境变量
        "PORT": "3000",
      },
      "env_production" : {
         "NODE_ENV": "production"
      }
    }
  ],
  //部署配置相关
  deploy : {  
     production : {  
        "user" : "marshal",// root用户
        "host" : ["xxx.xxx.xx.xx"], //ip  
        "ref" : "origin/master",  //分支
        "repo" : "git@github.com:Username/repository.git", //仓库
        "path" : "/var/www/my-repository", //导入路径
        "post-deploy" : "npm install",
     }  
  }
}

配置、部署命令

js 复制代码
//配置
pm2 deploy production setup
//部署
pm2 deploy production

当然如果嫌弃这个不满足自己的情况,也可以自己编写shell脚本

相关推荐
Eric_见嘉4 天前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
XiaoYu200212 天前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu200213 天前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄14 天前
NestJS 调试方案
后端·nestjs
当时只道寻常17 天前
NestJS 如何配置环境变量
nestjs
濮水大叔1 个月前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi1 个月前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs
ovensi1 个月前
Docker+NestJS+ELK:从零搭建全链路日志监控系统
后端·nestjs
Gogo8161 个月前
nestjs 的项目启动
nestjs