在VPS上使用PM2部署Node.js应用

在VPS上直接运行 node app.js 存在一个严重问题——关闭终端后应用就会停止,崩溃后也不会自动重启。PM2(进程管理器2) 是解决这些问题的一站式工具,提供自动重启、集群模式、日志管理和开机启动脚本。

1. PM2是什么及为什么使用它

PM2是最受欢迎的Node.js生产级进程管理器,主要功能如下:

功能说明
自动重启崩溃或内存溢出时自动重启应用
集群模式利用多个CPU核心提高吞吐量
日志管理分别记录stdout/stderr,支持实时查看
开机启动VPS重启后应用自动启动
零停机部署不中断连接地重载应用
监控查看每个进程的CPU/内存使用情况

2. 前提条件

建议: 使用 nvm 安装Node.js,便于管理多个版本。

3. 通过NVM安装Node.js

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc

# 安装Node.js LTS
nvm install --lts
nvm use --lts

# 验证安装
node -v
npm -v

4. 安装PM2

npm install -g pm2
pm2 -v

5. 使用PM2启动应用

# 基本启动
pm2 start app.js

# 指定名称(推荐)
pm2 start app.js --name "myapp"

# 带参数启动
pm2 start app.js --name "myapp" -- --port 3000

# 查看状态
pm2 status

# 实时查看日志
pm2 logs myapp
最佳实践: 始终使用 --name 指定名称,方便在同一VPS上管理多个应用。

6. 使用ecosystem.config.js管理配置

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'myapp',
    script: './app.js',
    instances: 'max',        // 集群模式 — 使用所有CPU核心
    exec_mode: 'cluster',
    watch: false,
    max_memory_restart: '500M',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss'
  }]
};
# 从配置文件启动
pm2 start ecosystem.config.js

# 零停机重载
pm2 reload ecosystem.config.js

7. 集群模式 — 提升性能

Node.js是单线程的。集群模式允许PM2使用多个CPU核心:

# 使用所有CPU核心
pm2 start app.js -i max

# 使用4个核心
pm2 start app.js -i 4

# 零停机重载
pm2 reload myapp
注意: 集群模式仅适用于无状态应用。如果应用在内存中存储会话,需改用Redis作为会话存储。

8. 开机启动脚本设置

# 生成启动脚本(复制输出的命令并用sudo运行)
pm2 startup

# 启动应用后保存状态
pm2 save
重要: 每次添加或删除进程后都要运行 pm2 save 以保存当前进程列表。

9. 日志管理

# 查看所有日志
pm2 logs

# 查看特定应用日志
pm2 logs myapp --lines 100

# 清空日志
pm2 flush

# 安装自动日志轮转
pm2 install pm2-logrotate

10. 监控与基本命令

# 实时仪表板
pm2 monit

# 列出所有进程
pm2 list

# 应用详细信息
pm2 show myapp

# 重启 / 停止 / 删除
pm2 restart myapp
pm2 stop myapp
pm2 delete myapp
命令说明
pm2 start启动新进程
pm2 restart重启(短暂停机)
pm2 reload零停机重载
pm2 stop停止(保留在列表中)
pm2 delete从列表中删除
pm2 save保存当前状态

11. Nginx反向代理配置

# /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
}

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

12. 零停机部署

# 拉取新代码
git pull origin main

# 安装依赖
npm install --production

# 零停机重载(集群模式)
pm2 reload myapp

# 或重启(非集群模式)
pm2 restart myapp
AsiaGB VPS: AsiaGB VPS采用SSD存储,提供高I/O性能,非常适合需要低响应时间的Node.js + PM2应用。提供泰国和新加坡数据中心,99%正常运行时间。

常见问题解答

PM2是什么?为什么要与Node.js一起使用?

PM2是生产级进程管理器,通过自动重启、集群模式和日志管理让Node.js应用24/7稳定运行,无需保持终端开启。

PM2和nodemon有什么区别?

nodemon用于开发环境(文件更改时自动重启),PM2用于生产环境——持续运行应用、支持多核集群模式并管理日志。

PM2的集群模式是什么?

集群模式让PM2根据CPU核心数生成多个工作进程,大幅提高高流量Node.js应用的吞吐量。

VPS重启后PM2还会继续运行吗?

是的,执行 pm2 startup 和 pm2 save 后,每次VPS重启时PM2都会自动启动您的应用。

PM2日志存储在哪里?

日志存储在 ~/.pm2/logs/,使用 pm2 logs 实时查看,通过 pm2 install pm2-logrotate 实现自动轮转。

可以在AsiaGB VPS上部署Node.js吗?

完全可以。AsiaGB VPS采用SSD存储,全面支持Node.js、PM2和Nginx,99%正常运行时间。

总结

PM2是在VPS上生产部署Node.js的必备工具。核心流程:安装PM2 → 使用ecosystem配置启动应用 → 启用集群模式 → 设置开机启动脚本 → 配置Nginx反向代理。需要可靠VPS来运行Node.js应用?查看 AsiaGB VPS,SSD存储,99%正常运行时间,专业支持。