前言
最近在总结公司项目技术栈的时候,在部署阶段涉及到了 PM2 相关内容,下面简单和大家分享一下。
目前公司使用 node + express + liquidjs 做的 SSR
大家应该都知道,nodejs是 单线程,无法充分利用CPU资源(多核)来提高并发;并且如果在生产环境,一旦运行报错,将导致服务中断,存在很大的安全隐患。下面就轮到 PM2 闪亮登场了。
PM2 是一个用于 Node.js 应用程序的 进程管理器, 帮助我们管理和保持应用程序在线。通常一般会在服务上线的时候使用 PM2 进行管理。PM2 能做的其实有很多, 比如监听文件改动自动重启, 统一管理多个进程, 内置的负载均衡, 日志系统 等。
下面我们创建一个 node 服务,使用 PM2 进行部署和管理。pm2 指令列表
初始化
- 全局安装
PM2(可以省略)
npm i pm2 -g
- 初始化配置文件
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>
- reload
- delete
- monit
配置文件
ecosystem.config.js