ByteNoteByteNote

字节笔记本

2026年5月3日

PM2 - Next.js 生产环境进程管理

API中转
¥120

本文介绍使用 PM2 管理 Next.js 生产环境进程的完整方案,包括配置文件编写、部署流程、日志管理和故障排除。

概述

PM2 是一个先进的 Node.js 进程管理器,用于在生产环境中保持应用程序永久运行,提供负载均衡和性能监控。

核心配置

ecosystem.config.js 配置文件

javascript
module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    env: {
      PORT: 3002,
      NODE_ENV: 'production'
    },
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G'
  }]
}

配置参数说明

参数说明
name应用名称nextjs-app
script启动脚本npm
args启动参数start
env.PORT端口号3002
env.NODE_ENV运行环境production
instances实例数量1
autorestart自动重启true
watch监听文件变化false
max_memory_restart内存限制1G

常用命令

基础操作

bash
# 启动应用
pm2 start ecosystem.config.js

# 查看所有进程
pm2 list

# 查看日志
pm2 logs nextjs-app

# 重启应用
pm2 restart nextjs-app

# 停止应用
pm2 stop nextjs-app

# 删除应用
pm2 delete nextjs-app

# 重启所有
pm2 restart all

# 停止所有
pm2 stop all

# 删除所有
pm2 delete all

持久化操作

bash
# 保存当前进程列表
pm2 save

# 开机自启动
pm2 startup

# 监控
pm2 monitor

部署流程

完整部署步骤

bash
# 1. 构建应用
npm run build

# 2. 创建配置文件
cat > ecosystem.config.js << 'EOF'
module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    env: {
      PORT: 3002,
      NODE_ENV: 'production'
    },
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G'
  }]
}
EOF

# 3. 启动应用
pm2 start ecosystem.config.js

# 4. 保存进程列表
pm2 save

# 5. 设置开机自启
pm2 startup

端口管理

端口冲突处理

当遇到 EADDRINUSE 错误时:

bash
# 方案1:使用不同端口
PORT=3002 npm run start

# 方案2:查找并停止占用端口的进程
lsof -ti:3000 | xargs kill -9

# 方案3:使用 PM2 自动管理端口
# 在 ecosystem.config.js 中设置不同的 PORT

进程状态

查看进程详情

bash
pm2 list

输出示例:

text
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ nextjs-app         │ cluster  │ 0    │ online    │ 0%       │ 56.1mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

状态说明

状态说明
online正在运行
stopped已停止
errored错误状态
launching正在启动

日志管理

查看日志

bash
# 查看所有日志
pm2 logs

# 查看特定应用日志
pm2 logs nextjs-app

# 实时监控日志
pm2 logs --lines 100

# 清空日志
pm2 flush

监控和性能

实时监控

bash
# 打开监控面板
pm2 monitor

# 查看详细信息
pm2 show nextjs-app

故障排除

常见问题

1. 应用无法启动

症状: pm2 start 后应用立即停止

解决方案:

bash
# 检查日志
pm2 logs nextjs-app --lines 50

# 检查端口占用
lsof -i:3002

# 检查构建文件
ls -la .next/

2. 内存泄漏

症状: 内存持续增长

解决方案:

javascript
// 在 ecosystem.config.js 中设置内存限制
max_memory_restart: '1G'  // 超过1G自动重启

3. 应用崩溃

症状: 进程频繁重启

解决方案:

bash
# 查看错误日志
pm2 logs --err

# 增加重启延迟
autorestart: true,
kill_retry: 10,  // 10秒后重启
min_uptime: '10s'  // 最小运行时间

高级配置

集群模式

javascript
module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    instances: 4,  // 启动4个实例
    exec_mode: 'cluster'  // 集群模式
  }]
}

环境变量管理

javascript
module.exports = {
  apps: [{
    name: 'nextjs-app',
    script: 'npm',
    args: 'start',
    env_production: {
      NODE_ENV: 'production',
      PORT: 3002
    },
    env_development: {
      NODE_ENV: 'development',
      PORT: 3000
    }
  }]
}

访问地址

应用启动后可通过以下地址访问:

  • 本地: http://localhost:3002

  • 网络: http://148.135.67.61:3002

  • 域名: https://skillslm.com/ (需配置反向代理)

最佳实践

  1. 始终使用配置文件 - 便于版本控制和团队协作

  2. 设置内存限制 - 防止内存泄漏导致服务器崩溃

  3. 启用日志记录 - 便于问题排查

  4. 配置开机自启 - 确保服务器重启后应用自动启动

  5. 使用版本管理 - 避免配置文件丢失

相关链接

分享: