PM2守护Node.js进程:VPS上让服务永不宕机的终极方案

概述

你的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服务穿上一层防弹衣。配好之后基本不用管,让它自己跑着就行。你的服务挂了它自己拉起来,服务器重启了自己启动。省下的运维时间够你喝好几杯咖啡了。

你现在的服务是怎么管理的?手动启动还是写了什么奇怪的脚本?

这篇文章对你有帮助吗?