概述
你的Node.js服务跑在VPS上,半夜崩了没人管,第二天用户全跑光了。手动写systemd脚本太麻烦,PM2就是来解决这个问题的。它不仅能守护进程,还能管理日志、负载均衡、监控CPU占用。很多生产环境都在用它。
这篇文章教你从零安装PM2,配置好你的第一个守护进程。
准备工作
- 一台运行Ubuntu 22.04+或Debian 12+的VPS
- Node.js 18+已安装(没装的先跑
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt install -y nodejs) - npm包管理器可用
- root或sudo权限
步骤
第一步:全局安装PM2
打开终端,执行:
npm install -g pm2
装完后检查版本:
pm2 --version
看到版本号就说明装好了。
第二步:启动你的Node.js应用
假设你有一个app.js文件在当前目录下:
pm2 start app.js --name my-app
--name参数给你的进程起个名字,方便后面管理。不指定的话PM2会随机分配一个。
如果你想用ecosystem文件批量管理多个服务,在项目根目录创建ecosystem.config.js:
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 2,
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/err.log',
out_file: './logs/out.log',
merge_logs: true,
max_memory_restart: '500M'
}]
};
然后启动:
pm2 start ecosystem.config.js
instances: 2和exec_mode: 'cluster'表示用集群模式启动两个实例,自动负载均衡。max_memory_restart: '500M'表示内存超500MB就自动重启,防止内存泄漏拖垮服务器。
第三步:设置开机自启
PM2提供了一个命令帮你生成systemd服务,开机自动拉起:
pm2 startup
命令会输出一段类似这样的内容:
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u $USER --hp /home/$USER
把输出的那行命令完整复制粘贴到终端执行。这样每次开机PM2会自动恢复之前管理的进程。
第四步:保存进程列表
pm2 save
这会把当前所有进程信息保存到~/.pm2/dump.pm2。配合上面的startup命令,实现真正的持久化。
验证
查看当前运行的进程:
pm2 list
输出类似:
┌────┬──────────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ id │ name │ mode │ pid │ status │ cpu │ mem │ user│ watching │ restart│ uptime │
├────┼──────────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ 0 │ my-app │ clus │ 1234 │ online │ 0% │ 45.2MB │ root│ disabled │ 0 │ 2h │
│ 1 │ my-app │ clus │ 1235 │ online │ 0% │ 44.8MB │ root│ disabled │ 0 │ 2h │
└────┴──────────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
看到status是online就说明进程在正常运行。
实时监控资源占用:
pm2 monit
会弹出交互式界面,显示每个进程的CPU和内存使用情况。按Ctrl+C退出。
测试自动重启:找到某个进程的pid,手动kill掉它:
pm2 info my-app # 查看pid
kill <pid>
然后再次执行pm2 list,你会发现那个进程的状态变成了online,pid也变了——PM2已经自动把它拉起来了。
常见问题
Q: 改了代码怎么更新?
pm2 reload my-app # 零停机热重载
# 或者
pm2 restart my-app # 重启
Q: 怎么看日志?
pm2 logs my-app # 实时查看日志
pm2 logs my-app --lines 100 # 只看最近100行
日志默认存在~/.pm2/logs/目录下。
Q: PM2占用的内存太多怎么办?
每个PM2进程大概占用10-20MB内存,影响不大。如果实在在意,可以调整日志轮转:
在ecosystem.config.js里加:
log_date_format: 'YYYY-MM-DD HH:mm:ss',
max_size: '10M',
max_files: 3,
min_uptime: '5s'
Q: 不小心删了pm2进程怎么恢复?
pm2 resurrect
这个命令会从dump文件恢复所有之前保存的进程。
Q: 如何卸载PM2?
pm2 unstartup systemd
pm2 kill
npm uninstall -g pm2
rm -rf ~/.pm2
PM2就是给Node.js服务穿上一层防弹衣。配好之后基本不用管,让它自己跑着就行。你的服务挂了它自己拉起来,服务器重启了自己启动。省下的运维时间够你喝好几杯咖啡了。
你现在的服务是怎么管理的?手动启动还是写了什么奇怪的脚本?