PM2 基本使用:Node 进程的守护、日志与开机自启

云原生与交付284 阅读约 4 分钟

直接 node app.js 跑生产是不行的——进程一崩就没了、关掉终端就停了、看日志也麻烦。PM2 解决的就是这些:进程守护、崩溃自动重启、多实例、日志聚合、开机自启。

常用命令

pm2 start app.js --name api      # 启动并命名
pm2 list                          # 查看所有进程状态
pm2 logs api                      # 实时日志(加 --lines 200 看更多)
pm2 restart api                   # 重启
pm2 reload api                    # 0 秒停机重载(cluster 模式下平滑)
pm2 stop api && pm2 delete api    # 停止并移除
pm2 monit                         # 实时 CPU/内存监控面板

restart 会真正重启进程(有短暂停机);reload 在 cluster 模式下逐个替换实例,零停机——生产更新优先用 reload

ecosystem 配置文件

命令行参数多了难维护,用配置文件统一管理:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'api',
    script: './dist/main.js',
    instances: 'max',        // 按 CPU 核数起多实例
    exec_mode: 'cluster',    // cluster 模式:多实例负载 + 平滑 reload
    max_memory_restart: '500M',   // 内存超限自动重启,防泄漏拖垮机器
    env: { NODE_ENV: 'production', PORT: 3000 },
  }],
}
pm2 start ecosystem.config.js     # 一键按配置启动

cluster 模式利用多核、支持平滑 reload;max_memory_restart 是个很实用的兜底——内存泄漏时自动重启,避免单进程吃满内存。

开机自启

服务器重启后进程要能自动拉起:

pm2 startup        # 生成并提示执行一条 systemd 自启命令
pm2 save           # 保存当前进程列表,开机时按它恢复

记得改完进程列表后再 pm2 save 一次,否则重启恢复的是旧快照。

与容器化的取舍

如今很多部署改用 Docker + 编排(容器自带重启策略 restart: always、健康检查),PM2 的「进程守护」职责被容器接管。但在单机直接跑 Node、或容器内需要 cluster 多实例时,PM2 依然好用。两者不冲突:容器管「容器活没活」,PM2 管「容器内多实例与平滑重载」。

小结

PM2 用一组简单命令解决了 Node 生产运行的核心诉求:守护、重启、多实例、日志、自启。配置沉淀到 ecosystem.config.js,生产更新用 reload 求零停机,再用 startup + save 搞定开机自启。

相关文章

评论 (6)

二两

小项目生产用 compose 还是直接上 k8s?感觉 k8s 太重了

G

Gavin

是的,生产上我就是这么做的,踩过坑才敢这么写 😄

辰小白

正好踩到这个坑,及时雨啊

T

Tina_w

反向代理那段解释得很到位

路过的猫

registry-mirror 配完拉镜像快太多了

E

Echo

看完顺手点个赞