Skip to content
文章摘要

pm2 管理和自动化部署node服务

最近使用了koa写了个简单的接口服务,然后使用了pm2来启动,管理和守护node服务,官网说PM2是一个守护进程管理器,它将帮助您管理并保持应用程序全天候在线。

功能如下:

行为的配置 源映射支持 容器集成 watch和 reload 日志管理 监控 模块系统 最大内存重新加载 集群模式 热重载 开发工作流程 启动脚本 部署工作流程 PAAS兼容 KEYMETRICS监控 API

可以直观的监控所有进程,可以提供微服务支持

https://pm2.keymetrics.io/

https://pm2.keymetrics.io/docs/usage/quick-start/

安装

我使用的是yarn,推荐使用yarn去管理模块。ps:推荐使用nvm去管理node版本。

bash
yarn global add pm2
yarn -v

常用命令

启动

没有使用webpack等打包工具打包的话,直接使用入口文件即可,koa的项目的index.js

bash
pm2 start 入口文件

可以添加响应的参数,常用的 -- name 指定app名称,-- watch 开启监控

查看服务列表

bash
pm2 list

开启集群模式

bash
pm2 start index.js --name app_name -i max

重启

bash
pm2 restart app_name

重载

bash
pm2 reload app_name

删除

bash
Pm2 delete app_name

暂停

bash
pm2 stop app_name

pm2 -h 可以看到所有命令 常用如下:

bash
    start [options] [name|namespace|file|ecosystem|id...]        start and daemonize an app
     deploy <file|environment>                                    deploy your json
     startOrRestart <json>                                        start or restart JSON file
     startOrReload <json>                                         start or gracefully reload JSON file
     startOrGracefulReload <json>                                 start or gracefully reload JSON file
     stop [options] <id|name|namespace|all|json|stdin...>         stop a process
     restart [options] <id|name|namespace|all|json|stdin...>      restart a process  
     reload <id|name|namespace|all>                               reload processes (note that its for app using HTTP/HTTPS)

     delete|del <name|id|namespace|script|all|json|stdin...>      stop and delete a process from pm2 process list

监控

bash
pm2 imonit / monit

日志

bash
pm2 logs ?app_name

更多请看pm2 -h

配置开机自动启动

  1. 启动服务后,执行保存 pm2 save
  2. 设置开机自动启动 pm2 startup 平台名称,如:ubuntu

自动化部署

依赖

安装git,开发和部署都安装好git和pm2 nvm node

如果是同时使用gitLab 和GitHub,需要配置一下

https://www.jianshu.com/p/c9336965b958

然后在gitlab上创建个仓库存放项目代码

生成配置文件

使用如下命令生成配置文件ecosystem.config.js,或者自己手动创建,注意如果多个版本的node环境,需要在执行前制定下使用版本,然后再安装依赖,接着继续编译打包,然后使用配置的是打包后的代码运行,也可以配置个开发的app制定入口文件。

bash
pm2 ecosystem

内容如下:

javascript
module.exports = {
  apps: [
    {
      script: "dist/main.js",
      watch: "dist",
    },
  ],

  deploy: {
    production: {
      user: "root",
      host: "*****",
      ref: "origin/master",
      repo: "git@******",
      path: "/usr/local/***",
      "pre-deploy-local": "",
      "post-deploy":
        "nvm use 14 && yarn install  && yarn build && pm2 startOrRestart ecosystem.config.js --env production",
      "pre-setup": "",
    },
  },
};

第一次部署

bash
pm2 deploy production setup

然后输入密码即可

更新项目

当代码变化后,提交到git后,自动执行下以下命令即可自动部署到制定服务器,但是需要服务器能访问到git仓库地址,有些真实环境可能需要堡垒机啥的可能就比较麻烦。

bash
pm2 deploy production update

可能遇到的错误

命令找不到等,原因就是因为我们使用了版本管理nvm导致找不到命令

因为本地执行 pm2 deploy 使用的 ssh 执行远程命令,非交互式环境,需要将 nvm 的配置放到 ~/.bashrc 的头部:

bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

然后运行:

bash
$ source ~/.bashrc

https://zhuanlan.zhihu.com/p/41235422

PM2下使用 执行npm命令

全局安装pm2

bash
npm install -g pm2

npm run dev 等同于 pm2 start npm -- run dev

npm start 等同于 pm2 start npm -- start

命名进程名

bash
pm2 start npm --name test -- run dev

pm2 start npm --name test -- start

语法:pm2 start npm --watch --name taskname --run scriptname 其中 --watch监听代码变化,--name重命名任务名称,--run后面跟脚本名字