1. PM2 是什么?Node.js 进程管理器的核心价值
第一次在生产环境部署 Node.js 应用时,我遇到了一个令人抓狂的问题:SSH 会话断开后,服务也跟着挂了。更糟的是,半夜收到报警说服务崩溃,不得不爬起来手动重启。这种经历让我意识到:直接通过 node app.js 运行生产服务就像用纸杯装开水——看似能用,实则隐患重重。
PM2 的出现彻底改变了这种局面。这个用 JavaScript 编写的进程管理器(Process Manager 2)已经成为 Node.js 生产环境部署的事实标准。它不仅仅是一个启动工具,而是提供了完整的生命周期管理方案。根据我的实战经验,PM2 主要解决以下四大生产环境痛点:
- 进程脆弱性:未捕获的异常、内存泄漏都会导致服务崩溃
- 会话依赖:SSH 断开连接时进程会被终止
- 恢复能力:服务器重启后需要人工干预
- 管理复杂度:多个微服务难以统一监控
技术细节:PM2 的守护进程(daemon)实际上是用 C++ 编写的,这保证了其核心稳定性。而管理界面采用 Node.js 实现,保持了生态一致性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 为什么传统启动方式不适合生产环境
2.1 Node.js 原生启动的致命缺陷
初学者最常使用的启动命令 node app.js 存在几个关键问题:
bash复制# 这种启动方式在生产环境存在严重隐患
node server.js
问题清单:
- 进程崩溃即服务终止(除非用 try-catch 包裹所有代码)
- 终端关闭会导致进程收到 SIGHUP 信号退出
- 没有内置日志轮转功能,stdout 输出可能撑爆磁盘
- 多核 CPU 利用率不足(Node.js 单线程模型)
2.2 手工解决方案的局限性
在发现 PM2 之前,我曾尝试用各种 Linux 工具组合解决问题:
bash复制# 使用 nohup 防止 SSH 断开终止进程
nohup node app.js > app.log 2>&1 &
# 用 supervisor 实现崩溃重启
sudo apt-get install supervisor
但这种方案存在明显短板:
- 日志管理需要额外配置 logrotate
- 多
