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脚本

相关推荐
HxY8 天前
Server Sent Event 技术实践
前端·后端·nestjs
浪遏20 天前
大文件上传👈 | React + NestJs |分片、断点续传、秒传🚀 , 你是否知道 ???
前端·面试·nestjs
白日梦想家12261 个月前
【nest系列】之 VO 的配置
nestjs
Junior_FE_20221 个月前
gRPC在Nest中的尝试
后端·nestjs
UOrb1 个月前
手把手从零到一打造在线文档之后端项目搭建
前端·nestjs
东方小月2 个月前
NestJS中如何优雅的实现接口日志记录
前端·后端·nestjs
Running_slave2 个月前
搭建Nestjs+TypeORM+TS服务端应用架构
前端·后端·nestjs
东方小月2 个月前
如何使用GitHub Actions自动部署我们的项目
前端·github·nestjs
泰伦闲鱼2 个月前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
求知若饥2 个月前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs