为什么我去了解 PM2?
在学习和使用 Node.js 部署应用的过程中,我发现如果直接用 node app.js 启动应用,一旦进程崩溃,服务就会直接中断,需要手动重启。 另外,日志查看也比较麻烦。带着问题,我开始接触 PM2 —— 一个专门为 Node.js 应用设计的进程管理工具。
PM2 的应用场景
- 进程管理: 如果你的 Node 应用崩溃了,这时候就需要另外一个进程来做自动重启这件事。
- 日志管理: Node 应用的日志默认输出在控制台,如果想输出到文件,可以让另一个进程获取 Node 应用的输出,然后写文件来实现。
- 负载均衡: Node 是单线程的,而机器是多个 CPU 的,为了充分利用 CPU 的能力,可以用多个进程来跑 Node 应用。
- 性能监控: 监控 Node 应用运行时的 CPU、内存等资源占用。
对应场景实操
全局安装 PM2: npm install pm2 -g
然后通过 node 跑是这样的,日志打印在控制台:
通过 pm2 则可以这样跑: pm2 start ./dist/main.js ,它会把这个 node 进程跑起来,并进行管理:
1. 日志管理
执行 pm2 logs
它会把所有进程的日志都记录下来,通过开头的 “进程id|进程名” 进行区分,比如 “7|main”。
同时它记录的日志分为正常日志和错误日志,分别对应 “进程名-out.log” 和 “进程名-error.log”,它们被保存在 ~/.pm2/logs 目录下:
因为 pm 可以起多个进程,在查看日志时可以指定 进程名 或 进程 id 来查看单个进程的日志:
2. 进程管理
pm2 进程管理可以手动启动、重启、停止某个进程,而且崩溃了会自动重启,也可以定时自动重启。
- 超过 100M 内存自动重启:
pm2 start xxxxx --max-memory-restart 100M - 文件内容改变自动重启:
pm2 start xxxxx --watch - 不自动重启:
pm2 start xxxxx --no-autorestart
测试超过指定内存大小自动重启
- 在代码中写一段测试代码
@Injectable()
export class AppService {
maxArr: String[] = [];
getHello(): string {
const str = new String('三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十三十');
for (let i = 0; i < 1000000; i++) {
this.maxArr.push(str);
}
return 'Hello World!';
}
}
- 代码构建后执行
pm2 start xxxxx --max-memory-restart 100M,指定 100M 后重启。
- 清空之前的日志
pm2 flush
- 访问刚才启动的服务: http://localhost:3000/
- 查看日志
崩溃的自动重启、定时自动重启、文件变动自动重启等也是类似; pm2 start、pm2 stop、pm2 restart、pm2 delete 等也是进程管理的功能。
3. 负载均衡
pm2 是基于 node 提供的 cluster 实现了负载均衡。
在执行 pm2 start xxxxx 是后面增加 -i CPU核心数 就可以实现负载均衡。这条命令会启动一个 集群(Cluster) ,并创建 -i 后指定数量的应用实例。
-
指定 CPU 核心数量:
pm2 start xxxxx -i 8,代表启动 8 个应用实例。 -
最大 CPU 核心数量:
pm2 start xxxxx -i max,代表创建尽可能多的应用实例,实例数量等于你当前服务器CPU的核心数。 -
最大 CPU 核心数量 - 1:
pm2 start xxxxx -i 0,根据服务器的 CPU 核心总数来自动创建实例,但会留出一个空闲的 CPU 核心。如果你的服务器是 8 核 CPU,执行
pm2 start app.js -i 0后,PM2 会启动 7 个app.js的 worker 进程。
指定 max 跑 nest 应用:
动态调整核心数
pm2 scale main 3将核心数调整为 3 个。pm2 scale main +3增加 3 个核心数。
4. 性能监控
执行 pm2 monit 即可启动性能监控。
在 pm2 官网 创建 bucket 后也可在线监控。
通过配置文件启动
执行 pm2 ecosystem 会创建对应配置文件:
module.exports = {
apps : [{
name: "app",
script: "./app.js",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
}
}, {
name: 'worker',
script: 'worker.js'
}]
}
有了配置文件后,执行 pm2 start ecosystem.config.js 即可启动,对应的还有 stop、restart、reload、delete 等命令。
详细配置可以看 pm2 官网。
总结
服务器上的 node 应用需要用 pm2 的日志管理、进程管理、负载均衡、性能监控等功能。
分别对应 pm2 logs、pm2 start/restart/stop/delete、pm2 start -i、pm2 monit 等命令。
多个应用或者想把启动选项保存下来的时候,可以通过 ecosystem 配置文件,批量启动一系列应用。