pm2
PM2的核心定位是Node.js应用的生产环境进程管理器,内置负载均衡,目标是让应用“永远存活”、崩溃自动重启、升级时零停机。
核心能力与场景
集群模式与零停机更新:只需pm2 start app.js -i max,PM2就会自动检测CPU核数,启动同等数量的子进程共享端口。更新代码时用pm2 reload,PM2逐个重启子进程,始终保留至少一个在运行,实现无中断服务。这对HTTP/WebScoket/TCP/UDP服务都有效。无需修改代码。
进程守护与开机:崩溃自动重启,pm2 start+pmw save组合可以让服务重启后应用自动恢复。进程列表保存在$HOME/.pm2/dump.pm2。
日志管理:自动捕获stdout/stdee,存储在~/.pm2/logs,通过pm2 logs实时查看。长期运行需安装pm2-logrotate模块防止磁盘占满。
多语言支持:除了Node.js,也可以管理Python、Bash等脚本,会自动匹配解释器。
配置文件
当启动参数较多或需要管理多个应用时,用ecosystem.config.js替代命令行。关键字段包括:name(应用名)、script(入口文件)、instance(实例数)、exec_mode(cluster或fork)、watch(文件监听)、max_memory_restart(内存超限重启)、以及env/env_production区分环境变量。
在容器中使用
Docker环境用pm2-runtiome替代pm2,它会以前台模式运行,适合作为容器CMD。注意:容器本身已有重启策略时,额外用PM2会增加内存开销(约83MB)且违背单进程原则,PM2在容器中的价值主要在于其进程管理功能和集群模式。
与替代方案的关键对比
| 维度 | PM2 | systemd |
|---|---|---|
| 内存开销 | ~83MB 守护进程 | 0(系统原生) |
| 集群模式 | 内置,零停机 reload | 不支持 |
| 跨平台 | Linux/macOS/Windows | 仅 Linux |
| 配置方式 | ecosystem.config.js | unit 文件 |
如果你已经在用systemd管理PM2本身,两者可以配合:PM2负责应用层集群和更新,systemd负责守护PM2守护进程并设置资源限制。