这是在 Linux 服务器上手动管理 Node.js 应用的标准方案,不依赖宝塔面板。
📋 什么是 nvm 和 pm2?
表格
| 工具 | 全称 | 作用 | 类比 |
|---|---|---|---|
| nvm | Node Version Manager | 管理多个 Node.js 版本 | 像 Python 的 pyenv |
| pm2 | Process Manager 2 | 管理 Node.js 进程 | 像 Python 的 supervisor |
text
编辑
┌─────────────────────────────────────────────────────────┐
│ 为什么需要它们? │
├─────────────────────────────────────────────────────────┤
│ nvm 解决的问题: │
│ ✅ 一键安装/切换 Node.js 版本 │
│ ✅ 不同项目用不同 Node 版本 │
│ ✅ 无需 sudo 权限安装 Node.js │
│ │
│ pm2 解决的问题: │
│ ✅ 进程守护(崩溃自动重启) │
│ ✅ 开机自启动 │
│ ✅ 日志管理 │
│ ✅ 多实例负载均衡 │
│ ✅ 性能监控 │
└─────────────────────────────────────────────────────────┘
🔧 第一部分:nvm 安装与使用
1.1 安装 nvm
bash
编辑
# SSH 连接到你的 Ubuntu 服务器
ssh ubuntu@192.168.220.130
# 方法 1:官方安装脚本(推荐)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 方法 2:国内镜像(如果官方慢)
curl -o- https://gitee.com/RubyMetric/nvm-china/raw/master/install.sh | bash
# 安装完成后,重新加载配置
source ~/.bashrc
# 验证安装
nvm --version
# 应显示:0.39.7
1.2 常用 nvm 命令
bash
编辑
# 查看可安装的 Node.js 版本
nvm ls-remote
# 安装 Node.js LTS 版本
nvm install --lts
# 或指定版本
nvm install 22.22.0
# 查看已安装的版本
nvm ls
# 切换 Node.js 版本
nvm use 22.22.0
# 设置默认版本
nvm alias default 22.22.0
# 卸载某个版本
nvm uninstall 20.0.0
# 查看当前使用的版本
nvm current
# 查看 Node.js 和 npm 版本
node -v
npm -v
1.3 nvm 版本管理示例
bash
编辑
# 场景:你有两个项目,需要不同 Node 版本
# 项目 A - 老项目,需要 Node 18
cd /home/ubuntu/old-project
nvm use 18
npm install
npm run start
# 项目 B - 新项目,需要 Node 22
cd /home/ubuntu/new-ecommerce
nvm use 22
npm install
npm run build
pm2 start dist/index.js
🔧 第二部分:pm2 安装与使用
2.1 安装 pm2
bash
编辑
# 确保已安装 Node.js(用 nvm)
nvm use 22
# 全局安装 pm2
npm install -g pm2
# 验证安装
pm2 --version
2.2 常用 pm2 命令
bash
编辑
# 启动应用
pm2 start dist/index.js --name ecommerce-api
# 指定 Node 版本启动
pm2 start dist/index.js --name ecommerce-api --interpreter ~/.nvm/versions/node/v22.22.0/bin/node
# 查看运行状态
pm2 status
# 查看日志
pm2 logs
pm2 logs ecommerce-api # 只看某个应用
# 重启应用
pm2 restart ecommerce-api
# 停止应用
pm2 stop ecommerce-api
# 删除应用
pm2 delete ecommerce-api
# 查看详细信息
pm2 show ecommerce-api
# 监控面板(实时查看 CPU/内存)
pm2 monit
# 保存当前进程列表(开机自启)
pm2 save
# 配置开机自启动
pm2 startup
# 按提示执行生成的命令,如:
# sudo env PATH=$PATH:/home/ubuntu/.nvm/versions/node/v22.22.0/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu
2.3 pm2 配置文件(推荐)
创建 ecosystem.config.js 文件:
javascript
编辑
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'ecommerce-api', // 应用名称
script: 'dist/index.js', // 启动文件
cwd: '/home/ubuntu/my-ecommerce', // 项目目录
instances: 4, // 实例数(CPU 核心数)
exec_mode: 'cluster', // 集群模式
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_development: {
NODE_ENV: 'development',
PORT: 3001
},
error_file: './logs/error.log', // 错误日志
out_file: './logs/out.log', // 输出日志
log_date_format: 'YYYY-MM-DD HH:mm:ss',
max_memory_restart: '500M', // 内存超过 500M 自动重启
watch: false, // 生产环境关闭文件监听
ignore_watch: ['node_modules', 'logs'],
max_restarts: 10, // 最大重启次数
min_uptime: '10s' // 最小运行时间
}
]
};
使用配置文件启动:
bash
编辑
# 启动所有应用
pm2 start ecosystem.config.js
# 启动指定环境
pm2 start ecosystem.config.js --env production
# 重启
pm2 restart ecosystem.config.js
# 停止
pm2 stop ecosystem.config.js
🚀 第三部分:完整部署流程示例
3.1 服务器环境准备
bash
编辑
# 1. 连接服务器
ssh ubuntu@192.168.220.130
# 2. 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
# 3. 安装 Node.js
nvm install 22.22.0
nvm alias default 22.22.0
# 4. 安装 pm2
npm install -g pm2
# 5. 安装 Nginx(反向代理)
sudo apt update
sudo apt install nginx -y
sudo systemctl start nginx
3.2 项目部署
bash
编辑
# 1. 创建项目目录
mkdir -p /home/ubuntu/my-ecommerce
cd /home/ubuntu/my-ecommerce
# 2. 上传代码(或 git clone)
git clone https://github.com/your/repo.git .
# 3. 安装依赖
npm install
# 4. 编译 TypeScript
npm run build
# 5. 创建 pm2 配置文件
# (参考上面的 ecosystem.config.js)
# 6. 启动应用
pm2 start ecosystem.config.js --env production
# 7. 保存并配置开机自启
pm2 save
pm2 startup
# 执行输出的 sudo 命令
3.3 配置 Nginx 反向代理
bash
编辑
# 创建 Nginx 配置
sudo nano /etc/nginx/sites-available/ecommerce
# 粘贴以下内容:
server {
listen 80;
server_name api.test.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# 启用配置
sudo ln -s /etc/nginx/sites-available/ecommerce /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
📊 第四部分:常用场景命令速查
表格
| 场景 | 命令 |
|---|---|
| 查看应用状态 | pm2 status |
| 查看实时日志 | pm2 logs --lines 100 |
| 重启应用 | pm2 restart all |
| 查看内存使用 | pm2 monit |
| 备份进程列表 | pm2 save |
| 恢复进程列表 | pm2 resurrect |
| 删除所有应用 | pm2 delete all |
| 清空日志 | pm2 flush |
| 切换 Node 版本 | nvm use 22 |
| 查看 Node 版本 | nvm current |
🔍 第五部分:常见问题解决
表格
| 问题 | 解决方法 |
|---|---|
| nvm 命令找不到 | source ~/.bashrc 或重启终端 |
| pm2 启动失败 | pm2 logs 查看错误,检查端口占用 |
| 开机不自启 | 重新执行 pm2 startup 生成的命令 |
| 日志文件太大 | pm2 flush 清空日志,配置日志轮转 |
| 应用崩溃重启 | 检查 pm2 logs,修复代码 bug |
| 内存泄漏 | 配置 max_memory_restart 自动重启 |
| Nginx 502 错误 | 确认 pm2 应用正在运行 pm2 status |
✅ 总结对比
表格
| 特性 | nvm | pm2 |
|---|---|---|
| 主要作用 | 管理 Node.js 版本 | 管理 Node.js 进程 |
| 安装位置 | ~/.nvm/ | 全局 npm 包 |
| 配置文件 | ~/.nvmrc | ecosystem.config.js |
| 开机自启 | 不需要 | 需要 pm2 startup |
| 日志管理 | 无 | 内置日志系统 |
| 集群模式 | 不支持 | 支持多实例 |