当我们完成了 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.js 或 server.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.logmy-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 应用时,建议遵循以下原则:
-
使用 ecosystem 配置文件 统一管理参数,避免命令过长。
-
使用 cluster 模式 充分利用多核 CPU,提高并发能力。
-
开启日志切割 防止磁盘被日志撑满。
-
配合 Nginx 使用 让 Nginx 负责反向代理与 HTTPS。
-
配合 CI/CD 实现自动部署与平滑重启。
十一、总结
在 Node.js 应用部署阶段,PM2 是不可或缺的基础设施工具。它解决了进程守护、自动重启、日志管理、多实例部署等一系列生产环境核心问题。
通过合理使用 PM2,你可以获得:
- 稳定的服务运行环境
- 自动容灾能力
- 更高的并发处理能力
- 可观测的进程状态
在《Node.js 编程实战》系列中,PM2 是从“开发态”迈向“生产态”的关键一步,为后续的 Nginx 部署、HTTPS 配置与高可用架构打下了坚实基础。