正在加载文档...
文档内容较大,正在处理中,请稍候
正在加载文档...
文档内容较大,正在处理中,请稍候
PM2 (Process Manager 2) 是一个强大的 Node.js 进程管理器,用于在生产环境中管理和监控 Node.js 应用程序。它提供了进程守护、自动重启、负载均衡、日志管理等核心功能。
# 使用 npm 全局安装
npm install -g pm2
# 使用 yarn 全局安装
yarn global add pm2
# 使用 pnpm 全局安装
pnpm add -g pm2# 查看 PM2 版本
pm2 --version
# 查看 Node.js 版本(确保 >= 18)
node --version项目使用 ecosystem.config.js 文件管理 PM2 配置,支持多环境配置。
apps/node-express-mysql/ecosystem.config.jsmodule.exports = {
apps: [
{
name: "node-express-mysql",
script: "index.js",
exec_mode: "cluster", // 集群模式
instances: 1, // 开发环境 1 个实例
env_development: {
NODE_ENV: "development",
PORT: 8888,
watch: true, // 开发环境开启文件监听
LOG_LEVEL: "DEBUG",
},
env_production: {
NODE_ENV: "production",
PORT: 8888,
instances: "max", // 生产环境使用所有 CPU 核心
LOG_LEVEL: "INFO",
},
},
],
};# 进入项目目录
cd /path/to/apps/node-express-mysql
# 开发环境启动
npm run pm2:dev
# 或
pm2 start ecosystem.config.js --env development
# 生产环境启动
npm run pm2:prod
# 或
pm2 start ecosystem.config.js --env production# 查看进程列表
pm2 list
# 查看进程详情
pm2 show node-express-mysql
# 查看日志
pm2 logs node-express-mysql
# 重启应用
pm2 restart node-express-mysql
# 停止应用
pm2 stop node-express-mysql
# 删除应用
pm2 delete node-express-mysqlapps/doc-next-ts/ecosystem.config.jsmodule.exports = {
apps: [
{
name: "doc-next-ts",
script: "node_modules/next/dist/bin/next",
args: "start -p 8081",
cwd: "/www/wwwroot/www.wladmin.cn", // 服务器实际路径
instances: 1, // Next.js 建议单实例
exec_mode: "fork",
autorestart: true,
max_memory_restart: "500M",
env_production: {
NODE_ENV: "production",
PORT: 8081,
},
},
],
};# 进入项目目录
cd /path/to/apps/doc-next-ts
# 生产环境启动
pm2 start ecosystem.config.js --env production
# 查看进程
pm2 list
# 查看日志
pm2 logs doc-next-ts# 基本启动
pm2 start app.js
# 指定应用名称
pm2 start app.js --name "my-app"
# 使用配置文件启动
pm2 start ecosystem.config.js
# 指定环境启动
pm2 start ecosystem.config.js --env production
# 启动并指定实例数
pm2 start app.js -i 4
# 启动所有 CPU 核心
pm2 start app.js -i max# 停止指定应用
pm2 stop app-name
# 停止所有应用
pm2 stop all
# 停止并删除
pm2 delete app-name# 重启指定应用
pm2 restart app-name
# 重启所有应用
pm2 restart all
# 0 秒停机重启(无缝重启)
pm2 reload app-name
# 重启并更新环境变量
pm2 restart app-name --update-env# 删除指定应用
pm2 delete app-name
# 删除所有应用
pm2 delete all# 查看进程列表
pm2 list
# 显示完整信息
pm2 list -l
# 显示简单信息
pm2 list -s
# 查看进程状态
pm2 status# 查看指定进程详情
pm2 show app-name
# 查看进程信息(JSON 格式)
pm2 describe app-name# 实时监控所有进程
pm2 monit
# 监控指定进程
pm2 monit app-name# 查看所有应用日志
pm2 logs
# 查看指定应用日志
pm2 logs app-name
# 查看最近 100 行日志
pm2 logs app-name --lines 100
# 实时查看日志(类似 tail -f)
pm2 logs app-name --lines 50
# 查看错误日志
pm2 logs app-name --err
# 查看标准输出日志
pm2 logs app-name --out# 清空所有日志
pm2 flush
# 清空指定应用日志
pm2 flush app-name# 扩展到 4 个实例
pm2 scale app-name 4
# 减少到 2 个实例
pm2 scale app-name 2
# 增加 2 个实例
pm2 scale app-name +2
# 减少 2 个实例
pm2 scale app-name -2# 保存当前进程列表
pm2 save
# 恢复保存的进程列表
pm2 resurrect
# 导出进程列表
pm2 dump# 检查 Node.js 版本
node --version # 需要 >= 18
# 检查 PM2 是否安装
pm2 --version
# 检查项目依赖是否安装
cd /path/to/project
npm install # 或 yarn install# 创建 .env 文件(后端服务)
cd /path/to/apps/node-express-mysql
cp .env.example .env
vim .env # 编辑环境变量
# 关键环境变量
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=your_database
JWT_SECRET=your-jwt-secret-key
REFRESH_SECRET=your-refresh-secret-key
NODE_ENV=production
PORT=8888cd /path/to/apps/node-express-mysqlnpm install
# 或
yarn install# 如果项目需要构建
npm run build# 使用 PM2 启动生产环境
pm2 start ecosystem.config.js --env production
# 或使用 npm 脚本
npm run pm2:prod# 查看进程状态
pm2 list
# 查看日志
pm2 logs node-express-mysql
# 检查服务是否正常运行
curl http://localhost:8888/api/health# 保存当前进程列表
pm2 savecd /path/to/apps/doc-next-tsnpm install
# 或
yarn install# Next.js 需要先构建
npm run build编辑 ecosystem.config.js,修改 cwd 为服务器实际路径:
cwd: "/www/wwwroot/www.wladmin.cn", // 修改为实际路径# 使用 PM2 启动
pm2 start ecosystem.config.js --env production# 查看进程状态
pm2 list
# 查看日志
pm2 logs doc-next-ts
# 检查服务
curl http://localhost:8081# 生成系统服务配置
pm2 startup
# 执行输出的命令(例如)
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u username --hp /home/username# 保存当前进程列表
pm2 save# 重启服务器
sudo reboot
# 重启后检查进程
pm2 list# 移除开机自启
pm2 unstartup# 方式 1:使用 reload(推荐,零停机)
pm2 reload app-name
# 方式 2:使用 restart
pm2 restart app-name
# 方式 3:停止后重新启动
pm2 stop app-name
pm2 start ecosystem.config.js --env production# 实时监控
pm2 monit
# 查看进程详情(包含资源使用)
pm2 show app-name# 后端服务:扩展到 4 个实例(充分利用多核 CPU)
pm2 scale node-express-mysql 4
# 查看实例状态
pm2 list# 查看实时日志
pm2 logs app-name
# 查看最近 200 行日志
pm2 logs app-name --lines 200
# 清空日志
pm2 flush app-name
# 导出日志到文件
pm2 logs app-name --lines 1000 > app.log# 方式 1:修改 .env 文件后重启
pm2 restart app-name --update-env
# 方式 2:修改 ecosystem.config.js 后重启
pm2 restart app-namepm2 list
# 显示 status: errored 或 status: stopped# 1. 查看错误日志
pm2 logs app-name --err --lines 100
# 2. 查看进程详情
pm2 show app-name
# 3. 检查配置文件
cat ecosystem.config.js
# 4. 检查环境变量
pm2 env app-name
# 5. 手动启动测试(不使用 PM2)
cd /path/to/project
node index.js # 或 npm start.env 文件配置npm installpm2 list
# restart 次数持续增加# 1. 查看重启原因
pm2 show app-name
# 查看 restart_time、unstable_restarts 等字段
# 2. 查看错误日志
pm2 logs app-name --err --lines 100
# 3. 查看内存使用
pm2 monit
# 4. 检查内存限制配置
# 如果设置了 max_memory_restart,内存超限会自动重启# 1. 增加内存限制
# 编辑 ecosystem.config.js
max_memory_restart: "1G" # 增加到 1GB
# 2. 检查应用内存泄漏
# 使用 Node.js 内存分析工具
# 3. 调整实例数
pm2 scale app-name 2 # 减少实例数,降低内存压力# 启动时提示端口被占用
Error: listen EADDRINUSE: address already in use :::8888# 1. 查找占用端口的进程
lsof -i :8888
# 或
netstat -tulpn | grep 8888
# 2. 查看 PM2 进程
pm2 list
# 检查是否有重复的进程# 方式 1:停止占用端口的进程
kill -9 <PID>
# 方式 2:删除 PM2 中的旧进程
pm2 delete app-name
pm2 start ecosystem.config.js --env production
# 方式 3:修改端口
# 编辑 .env 文件,修改 PORT=8889
pm2 restart app-name --update-env# 日志文件占用大量磁盘空间
du -sh ~/.pm2/logs/# 1. 清空日志
pm2 flush
# 2. 配置日志轮转(在 ecosystem.config.js 中)
log_date_format: "YYYY-MM-DD HH:mm:ss Z",
error_file: "./logs/err.log",
out_file: "./logs/out.log",
max_size: "10M", // 单个日志文件最大 10MB
retain: 5, // 保留 5 个日志文件
compress: true, // 压缩旧日志pm2 list
# 显示 status: stopped、errored、restarting 等异常状态# 1. 查看进程详情
pm2 show app-name
# 2. 查看错误日志
pm2 logs app-name --err --lines 100
# 3. 查看系统资源
pm2 monit
# 4. 检查系统日志
dmesg | tail
journalctl -xe# 1. 重启应用
pm2 restart app-name
# 2. 如果重启失败,删除后重新启动
pm2 delete app-name
pm2 start ecosystem.config.js --env production
# 3. 检查系统资源
# 如果内存或 CPU 不足,需要升级服务器配置# 修改 .env 文件后,应用仍使用旧配置# 1. 重启应用并更新环境变量
pm2 restart app-name --update-env
# 2. 检查环境变量
pm2 env app-name
# 3. 确认 .env 文件路径正确
# PM2 使用的工作目录(cwd)中的 .env 文件
# 4. 在 ecosystem.config.js 中直接配置环境变量
env_production: {
NODE_ENV: "production",
PORT: 8888,
// 直接在这里配置环境变量
}// ecosystem.config.js
env_production: {
NODE_ENV: "production",
exec_mode: "cluster", // 集群模式
instances: "max", // 使用所有 CPU 核心
// 或指定实例数
// instances: 4,
}// Next.js 建议使用单实例,内部会处理集群
env_production: {
NODE_ENV: "production",
instances: 1, // 单实例
exec_mode: "fork", // fork 模式
}// 设置内存限制,超过后自动重启
max_memory_restart: "500M", // 500MB// 关闭 PM2 日志捕获,使用应用自己的日志系统
error_file: "/dev/null",
out_file: "/dev/null",
output_capture: "error", // 仅捕获错误# 实时监控所有进程
pm2 monitPM2 Plus 是 PM2 的云监控服务,提供更强大的监控功能。
# 注册 PM2 Plus 账户
pm2 link <secret_key> <public_key>
# 查看监控数据
pm2 plus# 创建监控脚本
cat > /path/to/monitor.sh << 'EOF'
#!/bin/bash
# 检查进程状态
status=$(pm2 jlist | jq -r '.[] | select(.name=="app-name") | .pm2_env.status')
if [ "$status" != "online" ]; then
# 发送告警通知
echo "应用状态异常: $status"
# 可以集成邮件、短信、钉钉等通知
fi
EOF
# 添加到 crontab
crontab -e
# 添加:*/5 * * * * /path/to/monitor.shecosystem.config.js 提交到 Gitenv_development 和 env_production 分离配置autorestart: true 确保服务持续运行# 1. 拉取最新代码
git pull origin main
# 2. 安装依赖
npm install
# 3. 构建项目(如需要)
npm run build
# 4. 重启应用
pm2 reload app-name
# 5. 验证服务
pm2 list
pm2 logs app-name --lines 50A: 检查以下几点:
pm2 logs app-name --errA: 使用以下命令:
pm2 show app-name
pm2 describe app-name
pm2 monitA:
max_memory_restart 配置A: 使用 reload 命令实现零停机重启:
pm2 reload app-nameA: PM2 日志默认位置:
~/.pm2/logs/A:
pm2 startup
pm2 saveA:
pm2 monit
pm2 show app-nameA:
pm2 delete all这个管理Node服务很不错