使用 pm2 管理 node 进程
PM2 管理 Node.js 进程
PM2 是 Node 生产环境进程管理工具:后台运行、守护进程、自动重启、日志、负载均衡集群、开机自启。
前提:已经用 fnm/nvm 装好 Node + npm
1. 安装 pm2
npm install pm2 -g
验证
pm2 --version
2. 基础启动命令
普通启动
# 启动入口文件 app.js,命名服务名叫 myapp
pm2 start app.js --name myapp
# 指定 node 参数
pm2 start app.js --name myapp -- --max-old-space-size=2048
集群模式(多核负载均衡)
# max:根据CPU核心数自动创建进程
pm2 start app.js -i max --name my-cluster
# 指定4个实例
pm2 start app.js -i 4 --name my-cluster
其他启动方式
# 启动 npm script,例如 npm run start
pm2 start npm --name myapp -- run start
# 重启已存在的应用
pm2 restart myapp
# 重载(0停机,集群模式优雅重载,不杀死连接)
pm2 reload myapp
# 停止
pm2 stop myapp
# 删除进程(从pm2列表移除)
pm2 delete myapp
3. 查看状态与日志
# 查看进程列表
pm2 list
pm2 ls
# 实时日志
pm2 logs
# 只看某个应用日志
pm2 logs myapp
# 错误日志
pm2 logs myapp --err
# 限制行数
pm2 logs --lines 200
# 监控面板 cpu/memory
pm2 monit
# 显示应用详情
pm2 show myapp
4. 配置文件 ecosystem.config.js(推荐生产使用)
生成配置模板
pm2 init simple
示例 ecosystem.config.js
module.exports = {
apps: [
{
name: "my-server",
script: "./app.js",
instances: "max", // 集群实例数
exec_mode: "cluster", // cluster/fork
env: {
NODE_ENV: "production",
PORT: 3000
},
watch: false, // 生产关闭watch;开发可设true文件变动重启
max_memory_restart: "300M", // 内存超过自动重启
out_file: "./logs/out.log",
error_file: "./logs/err.log",
merge_logs: true,
autorestart: true, // 程序崩溃自动重启
}
]
}
使用配置文件操作:
pm2 start ecosystem.config.js
pm2 restart ecosystem.config.js
pm2 stop ecosystem.config.js
pm2 delete ecosystem.config.js
5. 开机自启(服务器重启自动跑pm2应用)
# 生成开机启动脚本
pm2 startup
# 保存当前pm2进程列表,开机恢复
pm2 save
# 如果想清除保存的进程列表
pm2 resurrect
pm2 cleardump
⚠️ fnm 用户坑点:
pm2 startup 生成的系统服务默认使用系统node,不会读取 shell fnm 环境变量。
两种解决:
- 在
ecosystem.config.js指定interpreter指向 fnm 的 node 二进制路径
interpreter: "/home/xxx/.fnm/node-versions/v22.14.0/installation/bin/node"
- 或者用
pm2 startup之后,在系统service里手动指定 PATH。
6. 常用命令速查
pm2 list # 进程列表
pm2 start|restart|stop|del # 启动/重启/停止/删除
pm2 reload <app> # 零停机重载(集群)
pm2 logs # 日志
pm2 monit # 监控
pm2 save # 保存进程快照
pm2 startup # 开机自启
pm2 flush # 清空全部日志
7. 开发 vs 生产注意点
- 开发环境:可以开启
watch:true,文件修改自动重启 - 生产环境务必关闭 watch,避免磁盘IO和意外重启
reload用于集群优雅更新;restart是硬杀进程重启
8. 常见问题
- pm2 启动用的不是 fnm 的 node 版本
pm2是系统服务,不读取shell环境,需要显式指定 interpreter 绝对路径。
- 应用不断自动重启
看pm2 logs,大概率代码报错、端口占用、内存溢出。 - 日志文件越来越大
可以搭配 pm2-logrotate 做日志切割:
pm2 install pm2-logrotate