使用pm2管理你的项目

使用pm2管理你的项目

前言

笔者从前一直觉得 docker/k8s 在手天下我有,集群运行与部署无往不利。但忽略了一个前提,这是基于容器化的技术,绝大多数情况下在 Linux 中使用,其它的容器诸如 Windows Container,坑点很多配置也麻烦。有时候需要在非 Linux 的场景下运作,这套执行难度还是比较大的。

于是笔者前段时间抽空使用 tauri 开发了一个桌面应用,通过将项目的路径、启动脚本等信息写在json中,然后作为配置文件导入,来实现在应用上通过点击实现项目的运行部署等等功能。理想很美好,现实很骨感,当开发到项目重启的功能时,由于笔者对 cmd 脚本知之甚少,并且由于很烦写界面UI,最终项目搁浅了。

不过,昨天突然想到了传闻中的一个npm包——pm2,便去研究了一下,感觉功能还是很强大的并且比较全面的,无论是在终端还是Dashboard中使用都很方便,此外我的桌面应用也完全可以直接基于pm2进行更方便的开发。

不多废话了,我们来看看 pm2 可以做些什么吧!

安装

全局安装 pm2 即可,前提是有安装 node14+

npm i pm2 -g

启动应用

pm2 start :
你可在命令行里运行一个node项目,假设node index.js可以跑起来一个项目:

pm2 start -name "node-app" node -- index

你也可以写成一个json,比如一个 app.json:

{
    
    
  "apps": {
    
    
    "name": "node-app",
    script: "node",
    "args": [
      "index"
    ]
  }
}

然后通过 json 去启动项目:

pm2 start app.json

[仅限Linux]假设你的项目通过npm脚本npm start运行:

pm2 start -name "node-app" npm -- start

windows上你必须指定script为 "npm-cli"的路径,比如:

pm2 start -n "node-app" "D:\\ProgramSoftware\\nvm\\v16.17.1\\node_modules\\npm\\bin\\npm-cli.js" -- run start

不过会弹出一个无法隐藏的cmd黑框,如果你不介意的话那就这样
或者通过 cmd 去执行命令:

pm2 start -n "node-app" cmd -- /c npm start

也可以把执行命令包装成一个js脚本,然后让pm2 执行这个脚本:

const {
    
    exec} = require('child_process');
const pros = exec("mvn org.springframework.boot:spring-boot-maven-plugin:run -Dspring-boot.run.jvmArguments='-Dfile.encoding=UTF-8'",{
    
    cwd: process.cwd()});
pros.stderr.on('error', err => console.error(`${
      
      err}`));
pros.stdout.on('data', (data) => {
    
    
  console.log(`${
      
      data}`);
});
pros.on('error', (err) =>{
    
    
  console.error(`${
      
      err}`);
})
pros.on('close', (code) => {
    
    
  console.log(`child process exited with code ${
      
      code}`);
}); 

启动其它语言项目

pm2不仅仅可以启动 node 项目,其它语言的项目也能支持!比如 java:
终端式:

pm2 start -n "java-app" java -- -jar example-0.0.1.jar

Json式:

{
    
    
  "apps": {
    
    
    "name": "java-app",
    script: "java",
    "args": [
      "-jar",
      "example-0.0.1.jar"
    ]
  }
}

Js式(可以通过pm2 init快速生成):

module.exports = {
    
    
  apps : [{
    
    
    name: 'node-app1',
    script: './sv1/index.js',
    watch: './sv1',
    namespace: 'node-demo'
  }, {
    
    
    name: 'node-app2',
    script: './sv2/index.js',
    watch: './sv2',
    namespace: 'node-demo'
  }]
};

除了这几种,其它诸如 yml 等格式也支持。
不过需要避坑的一点是,script本质是这个可执行程序的地址,比如在pm2运行时,假设 java.exe 位于 C:\jdk\bin下,实际执行的是:

C:\JDK\BIN\JAVA -jar example-0.0.1.jar

你需要注意的是这整个路径被大写了,但并不是所有语言都支持大写,比如rust:

'CARGO' is not valid proxy name, th valid names are 'cargo', 'rustc'...

对于这种,你必须直接指定完整的路径,正如npm那边一样:

{
    
    
  //...
  "script": "C:\\Users\\GrapeX\\.cargo\\bin\\cargo.exe"
}

同样会弹出一个无法隐藏的cmd黑框
或者你有办法在系统环境中持久的指定 CARGO 等效于 cargo,笔者目前还没有找到这种方法

管理应用

对于一个已经存在与 pm2 中的应用,你可以对他进行停止、重启等操作。

  • pm2 stop <id|name|namespace|all|json|stdin>:停止指定的应用
  • pm2 restart <id|name|namespace|all|json|stdin>:重启指定的应用
  • pm2 reload <id|name|namespace|all|json|stdin>:即刻重载web应用
  • pm2 delete <id|name|namespace|all|json|stdin>:删除指定的应用

持久服务

有了 pm2,我们甚至不需要额外的下载注册服务的工具

  1. 首先保存 pm2 应用:
pm2 save
  1. 注册开机自启服务
    Linux:
pm2 startup [--service-name <name>]

Windows: 需要先安装pm2-windows-startup

npm i pm2-windows-startup -g

然后安装服务:

pm2-startup install
  1. 禁用开机自启
    Linux:
pm2 unstartup

Windows:

pm2-startup uninstall

应用监控

  • pm2 ls:终端中查看所有应用状况
  • pm2 monit:打开终端的监控面板
  • pm2 plus:在浏览器中的Dashboard,我使用 pm2 plus报错,可以直接访问网址https://app.pm2.io/

查看日志

  • pm2 log:查看所有应用日志
  • pm2 log <id|name|namespace|all|json|stdin>:查看指定日志

应用集群

你可以将一系列应用划分到一个命名空间内作为一个集群,通过指定namespace,进行全体的重启等操作。
以 ecosystem.config.js 为例,这一组应用包含了2个 node 应用:

module.exports = {
    
    
  apps : [{
    
    
    name: 'node-app1',
    script: './sv1/index.js',
    watch: './sv1',
    namespace: 'node-demo'
  }, {
    
    
    name: 'node-app2',
    script: './sv2/index.js',
    watch: './sv2',
    namespace: 'node-demo'
  }]
};

负载均衡

当一个应用启动模式为 cluster 时,会自动开启负载均衡

静态服务器

是的,你没看错,pm2 还能充当静态服务器:

pm2 serve <path> <port>

或者通过配置文件:

module.exports = {
    
    
  script: "serve",
  env: {
    
    
    PM2_SERVE_PATH: '.',
    PM2_SERVE_PORT: 8080
  }
}

应用部署

PM2 具有简单但功能强大的部署系统,允许在生产环境中配置和更新应用程序。当您想一次在一台或多台服务器上的裸机服务器上部署应用程序时,这非常有用。详见:https://pm2.fenxianglu.cn/docs/general/deployment-system

猜你喜欢

转载自blog.csdn.net/m0_51810668/article/details/131256115