进程守护-pm2

284 阅读2分钟

前言

最近在总结公司项目技术栈的时候,在部署阶段涉及到了 PM2 相关内容,下面简单和大家分享一下。

目前公司使用 node + express + liquidjs 做的 SSR

大家应该都知道,nodejs是 单线程,无法充分利用CPU资源(多核)来提高并发;并且如果在生产环境,一旦运行报错,将导致服务中断,存在很大的安全隐患。下面就轮到 PM2 闪亮登场了。

PM2 是一个用于 Node.js 应用程序的 进程管理器, 帮助我们管理和保持应用程序在线。通常一般会在服务上线的时候使用 PM2 进行管理。PM2 能做的其实有很多, 比如监听文件改动自动重启, 统一管理多个进程, 内置的负载均衡, 日志系统 等。

下面我们创建一个 node 服务,使用 PM2 进行部署和管理。pm2 指令列表

初始化

  1. 全局安装 PM2(可以省略)
npm i pm2 -g
  1. 初始化配置文件
mkdir pm2 & cd pm2
touch app.js
pm2 init simple

执行完成后,目录如下

├── app.js
└── ecosystem.config.js

修改app.js代码如下:

const http = require("http");
const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.write("hello world");
  res.end();
});

server.listen(3000);

模式

  • fork
  • cluster

基础命令

启动

pm2 start

第一次必须使用 start 进行启动

pm2 start app.js --watch
# 指定应用的名字,应用程序中可以通过 process.env.name 获取
-n, --name <app_name>

# 监听文件修改重启应用
--watch

# 内存超过设定值自动重启进程
--max-memory-restart <200MB>

# 指定log文件, 如 logs/app.log
-l, --log <log_path>

# 指定输出日志文件
-o, --output <path_path>

# 指定错误日志文件
e, --error <path_path>

# 启动的实例个数
-i, --instances <number | max>

# 当ecosystem.config.js 配置多个时,只启动一个应用程序
--only <app_name>

重启

pm2 restart

暂停

pm2 stop <id,name,all,json,stdin,ect>

# 停止指定id为1的进程
pm2 stop 1

# 停止制定name为app1的进程
pm2 stop app1

# 停止所有进程
pm2 stop all

打印日志

pm2 logs

查看所有应用程序的状态

pm2 [list|ls|status]

# 清空所有日志文件
pm2 flush

开机启动/禁止开机启动

pm2 startup/unstartup

触发事件

pm2 trigger <app_name|id> <event_name>

启动或重启应用程序

pm2 startOrRestart <ecosystem.config.js>

如果指定的应用程序还没有运行, 就启动它;如果已经在运行,则重启

启动或重新加载应用程序

pm2 startOrReload <ecosystem.config.js> 如果指定的应用程序还没有运行,就启动它;如果已经在运行,则会重新加载。与 startOrRestart 不同,startOrReload 会尽量保持应用程序的平滑运行,最小化停机时间,尤其在使用集群模式时会逐个重启各个实例

pm2 deploy <configuration_file>

  1. reload
  2. delete
  3. monit

配置文件

ecosystem.config.js