Node.js 编程实战:部署 Node.js 应用 —— PM2 管理与守护

0 阅读4分钟

当我们完成了 Node.js 应用的开发,本地运行一切正常之后,接下来面临的一个关键问题是: 如何让应用在服务器上长期、稳定地运行?

如果直接使用 node app.js 启动进程,一旦服务器重启、终端断开或进程异常崩溃,服务就会立刻停止,这在生产环境中是完全不可接受的。

为了解决这些问题,生产环境中最常用的工具之一就是 PM2。本文将从实战角度,系统讲解如何使用 PM2 对 Node.js 应用进行进程管理、守护、日志管理与自动重启


一、为什么需要 PM2

在生产环境中运行 Node.js 服务,通常会遇到以下问题:

  • 终端断开,进程随之退出
  • 代码异常导致服务崩溃
  • 服务器重启后需要手动拉起服务
  • 多实例部署难以管理
  • 日志零散,不便排查问题

PM2 正是为解决这些问题而生,它具备以下核心能力:

  • 进程守护与自动重启
  • 多实例集群模式
  • 统一日志管理
  • 启动脚本与开机自启
  • 进程监控与性能统计

在绝大多数 Node.js 生产环境中,PM2 都是事实上的标准方案。


二、安装 PM2

1. 全局安装

npm install -g pm2

安装完成后,确认版本:

pm2 -v

三、使用 PM2 启动应用

假设你的入口文件是 app.jsserver.js

1. 基本启动方式

pm2 start app.js --name my-app

这里:

  • app.js 是入口文件
  • my-app 是进程名称,便于后续管理

2. 查看进程列表

pm2 list

你可以看到:

  • 进程名称
  • 进程 ID
  • 运行状态
  • CPU / 内存占用

3. 查看日志

pm2 logs my-app

或者:

pm2 logs

PM2 会自动将 stdout 与 stderr 写入日志文件,便于线上排错。


四、进程守护与自动重启

1. 应用崩溃自动拉起

当 Node.js 进程因异常退出时,PM2 会自动重启进程,无需人工干预。

你可以通过人为制造一个异常来验证:

setTimeout(() => {
  throw new Error('crash test');
}, 3000);

几秒后,PM2 会重新拉起该进程。


2. 最大重启次数限制

pm2 start app.js --name my-app --max-restarts 5

当应用在短时间内频繁崩溃时,PM2 会停止重启,防止无限循环。


五、集群模式(多进程)

在多核服务器上,推荐使用 PM2 的 cluster 模式 提高并发能力。

pm2 start app.js --name my-app -i max

说明:

  • -i max 表示根据 CPU 核心数自动启动多个实例
  • 所有实例共享同一端口
  • PM2 内部实现负载均衡

查看效果:

pm2 list

你会看到多个 my-app 实例在同时运行。


六、使用 ecosystem 配置文件

当项目参数较多时,推荐使用 ecosystem.config.js 统一管理。

1. 创建配置文件

pm2 init

生成 ecosystem.config.js


2. 示例配置

module.exports = {
  apps: [
    {
      name: 'my-app',
      script: 'app.js',
      instances: 'max',
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'development',
        PORT: 3000
      },
      env_production: {
        NODE_ENV: 'production',
        PORT: 3000
      },
      max_restarts: 5,
      watch: false,
      autorestart: true
    }
  ]
};

3. 使用配置文件启动

pm2 start ecosystem.config.js --env production

七、日志管理与切割

1. 默认日志位置

PM2 默认日志目录:

~/.pm2/logs/

每个应用会生成:

  • my-app-out.log
  • my-app-error.log

2. 日志切割插件

长时间运行后,日志文件会不断增大,推荐安装日志切割模块:

pm2 install pm2-logrotate

常用配置:

pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10
pm2 set pm2-logrotate:compress true

八、开机自启

为了在服务器重启后自动拉起服务,需要设置 PM2 开机自启。

pm2 startup

按照终端提示执行生成的命令。

然后保存当前进程列表:

pm2 save

这样在服务器重启后,PM2 会自动恢复所有进程。


九、常用管理命令汇总

pm2 start app.js
pm2 stop my-app
pm2 restart my-app
pm2 reload my-app
pm2 delete my-app
pm2 list
pm2 logs my-app
pm2 monit

其中:

  • restart 会中断服务
  • reload 支持零停机重启(cluster 模式下)

十、生产环境实战建议

在真实项目中,使用 PM2 管理 Node.js 应用时,建议遵循以下原则:

  1. 使用 ecosystem 配置文件 统一管理参数,避免命令过长。

  2. 使用 cluster 模式 充分利用多核 CPU,提高并发能力。

  3. 开启日志切割 防止磁盘被日志撑满。

  4. 配合 Nginx 使用 让 Nginx 负责反向代理与 HTTPS。

  5. 配合 CI/CD 实现自动部署与平滑重启。


十一、总结

在 Node.js 应用部署阶段,PM2 是不可或缺的基础设施工具。它解决了进程守护、自动重启、日志管理、多实例部署等一系列生产环境核心问题。

通过合理使用 PM2,你可以获得:

  • 稳定的服务运行环境
  • 自动容灾能力
  • 更高的并发处理能力
  • 可观测的进程状态

在《Node.js 编程实战》系列中,PM2 是从“开发态”迈向“生产态”的关键一步,为后续的 Nginx 部署、HTTPS 配置与高可用架构打下了坚实基础。