赞
踩
笔者从前一直觉得 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,我们甚至不需要额外的下载注册服务的工具
pm2 save
pm2 startup [--service-name <name>]
Windows: 需要先安装pm2-windows-startup
npm i pm2-windows-startup -g
然后安装服务:
pm2-startup install
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。