PM2 从入门到精通

PM2 从入门到精通

目录

常用配置 【放这里方便大家直接cv,部署项目】

以下是一个简单的单例应用ecosystem.config.js配置示例,适合日常使用:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: "my-app",               // 应用名称
    script: "./app.js",           // 入口脚本
    watch: false,                 // 是否监视文件变化
    max_memory_restart: "300M",   // 内存限制
    env: {                        // 默认环境变量
      NODE_ENV: "development",
      PORT: 3000
    },
    env_production: {             // 生产环境变量
      NODE_ENV: "production",
      PORT: 8080
    },
    log_date_format: "YYYY-MM-DD HH:mm:ss",  // 日志日期格式
    error_file: "./logs/error.log",          // 错误日志
    out_file: "./logs/out.log",              // 标准输出日志
    merge_logs: true,                        // 合并日志
    autorestart: true                        // 自动重启
  }]
};

使用方法:

# 开发环境启动
pm2 start ecosystem.config.js

# 生产环境启动
pm2 start ecosystem.config.js --env production

# 重启应用
pm2 restart ecosystem.config.js

这个简单配置包含了单个应用的基本设置,适合大多数项目使用。你可以根据需要添加或删除配置项。

简介

PM2(Process Manager 2)是一个为Node.js应用程序设计的生产环境进程管理器。它允许你保持应用程序永远在线,无需停机即可重新加载,并简化常见的系统管理任务。

PM2的主要特点:

  • 应用程序监控
  • 自动重启
  • 日志管理
  • 集群模式
  • 零停机重载
  • 启动脚本
  • 多平台支持
  • 内置负载均衡
  • 容器集成

安装

全局安装

npm install pm2 -g

使用yarn

yarn global add pm2

验证安装

pm2 --version

基础使用

启动应用

# 基本启动
pm2 start app.js

# 指定应用名称
pm2 start app.js --name "my-app"

# 启动并监视文件变化(开发环境)
pm2 start app.js --watch

# 设置环境变量
pm2 start app.js --env production

管理应用进程

# 列出所有应用
pm2 list

# 显示应用详细信息
pm2 show <app_name|id>

# 重启应用
pm2 restart <app_name|id>

# 停止应用
pm2 stop <app_name|id>

# 删除应用
pm2 delete <app_name|id>

# 重启所有应用
pm2 restart all

# 停止所有应用
pm2 stop all

# 删除所有应用
pm2 delete all

进程管理

管理多个应用

# 同时启动多个应用
pm2 start app1.js app2.js app3.js

# 使用不同配置启动多个应用
pm2 start app1.js --name "app1" -- watch
pm2 start app2.js --name "app2" --env production

自动重启策略

PM2可以配置不同的重启策略:

# 出错时重启
pm2 start app.js --max-restarts 10

# 设置内存限制(当超过此限制时自动重启)
pm2 start app.js --max-memory-restart 500M

配置文件

PM2可以使用配置文件(通常命名为ecosystem.config.js)来管理多个应用及其配置。

创建配置文件

pm2 init

这将创建一个基本的ecosystem.config.js文件,你可以编辑它:

module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    instances: "max",
    exec_mode: "cluster",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
    }
  }]
}

使用配置文件

# 启动配置文件中定义的所有应用
pm2 start ecosystem.config.js

# 启动特定应用
pm2 start ecosystem.config.js --only app1

# 使用特定环境
pm2 start ecosystem.config.js --env production

配置选项

常用配置选项:

选项描述
name应用名称
script启动脚本路径
cwd应用目录
args传递给脚本的参数
instances实例数量(集群模式)
exec_mode执行模式 (‘fork’ 或 ‘cluster’)
watch是否监视文件变化
ignore_watch指定不监视的文件或目录
max_memory_restart内存限制
env_*特定环境配置
log_date_format日志日期格式
error_file错误日志文件路径
out_file输出日志文件路径
pid_filePID文件路径
cron_restartcron表达式重启策略
autorestart进程崩溃后是否自动重启

日志管理

查看日志

# 显示所有应用的日志
pm2 logs

# 显示特定应用的日志
pm2 logs <app_name|id>

# 显示行数限制
pm2 logs --lines 200

# 显示JSON格式日志
pm2 logs --json

日志配置

在配置文件中可以定义日志相关设置:

module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    log_date_format: "YYYY-MM-DD HH:mm:ss",
    error_file: "./logs/error.log",
    out_file: "./logs/out.log",
    log_file: "./logs/combined.log",
    combine_logs: true,
    // 日志轮转设置
    log_type: "json",
    merge_logs: true,
  }]
}

日志轮转

PM2内置了日志轮转功能,使用pm2-logrotate模块:

pm2 install pm2-logrotate

# 配置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'

监控

实时监控

# 启动内置监控
pm2 monit

这将打开一个基于终端的监控界面,显示CPU使用率、内存使用、响应时间等信息。

PM2 Plus (云端监控)

PM2提供了一个名为PM2 Plus的云监控服务:

# 注册并链接
pm2 register
pm2 link <secret> <public>

PM2 Plus提供:

  • 长期指标历史
  • 异常追踪
  • 实时日志访问
  • 自动化部署
  • 团队协作
  • 警报和通知

集群模式

PM2的一个强大功能是能够在多个CPU核心上运行Node.js应用的多个实例。

启用集群模式

# 使用最大CPU核心数
pm2 start app.js -i max

# 使用指定数量的核心
pm2 start app.js -i 4

# 在配置文件中
module.exports = {
  apps : [{
    name: "app",
    script: "./app.js",
    instances: "max",
    exec_mode: "cluster"
  }]
}

使用场景

集群模式适合:

  • 无状态应用
  • CPU密集型应用
  • 高流量服务
  • 需要高可用性的应用

负载均衡

PM2的集群模式自动包含负载均衡功能,使用Node.js的cluster模块来跨进程分配请求。

部署

PM2提供了简化部署流程的功能。

设置部署配置

ecosystem.config.js中添加部署配置:

module.exports = {
  apps: [{
    name: "app",
    script: "app.js"
  }],
  deploy: {
    production: {
      user: "username",
      host: ["host1", "host2"],
      ref: "origin/master",
      repo: "git@github.com:repo.git",
      path: "/var/www/production",
      "pre-deploy": "git fetch --all",
      "post-deploy": "npm install && pm2 reload ecosystem.config.js --env production"
    },
    staging: {
      // 类似的配置...
    }
  }
}

执行部署

# 首次设置
pm2 deploy production setup

# 部署
pm2 deploy production

# 部署并执行特定命令
pm2 deploy production exec "npm run build"

# 回滚
pm2 deploy production revert 2

高级功能

开机自启

PM2可以生成启动脚本以确保服务器重启后应用自动启动:

# 生成并配置启动脚本
pm2 startup

# 保存当前运行的应用列表
pm2 save

优雅重启

PM2支持优雅重启,允许您在不丢失连接的情况下更新应用程序:

pm2 gracefulReload all

触发事件

PM2允许在应用生命周期的不同点触发自定义操作:

// 在应用中
process.on('SIGINT', function() {
  // 清理操作
  db.close();
  process.exit(0);
});

使用钩子

在配置文件中定义钩子来自动化操作:

module.exports = {
  apps: [{
    name: "app",
    script: "./app.js",
    // 生命周期钩子
    "pre-setup": "npm install",
    "post-start": "echo 'App has started'",
    "pre-stop": "echo 'App is stopping'",
    "post-restart": "echo 'App has restarted'"
  }]
}

使用模块扩展PM2

PM2支持模块来扩展其功能:

# 安装模块
pm2 install pm2-logrotate

# 查看已安装模块
pm2 module list

# 卸载模块
pm2 uninstall pm2-logrotate

最佳实践

生产环境配置

  1. 总是使用配置文件:使用ecosystem.config.js管理所有设置
  2. 设置内存限制:通过max_memory_restart防止内存泄漏
  3. 启用集群模式:充分利用多核CPU
  4. 配置日志:设置日志轮转和适当的格式
  5. 配置启动脚本:使用pm2 startuppm2 save确保可靠性
  6. 设置环境变量:使用--env区分不同环境
  7. 监控应用:使用pm2 monit或PM2 Plus观察性能

安全考虑

  1. 限制资源使用:设置内存和CPU限制
  2. 特权降级:使用非root用户运行PM2
  3. 安全处理敏感信息:使用环境变量或密钥管理系统
  4. 保护PM2 API:如果使用PM2 API,确保适当的访问控制

容器化环境

在Docker等容器环境中使用PM2:

  1. 使用pm2-runtime(专为容器设计):

    pm2-runtime start ecosystem.config.js
    
  2. Dockerfile示例:

    FROM node:14
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm install pm2 -g
    CMD ["pm2-runtime", "ecosystem.config.js"]
    

常见问题与解决方案

问题1: 应用崩溃但PM2没有重启

解决方案:

  • 检查autorestart设置是否为true
  • 增加max_restarts
  • 检查应用是否以0状态码退出(PM2认为这是正常退出)

问题2: 内存使用持续增加

解决方案:

  • 设置max_memory_restart限制
  • 使用内存泄漏检测工具调查
  • 考虑实现定期重启策略

问题3: 日志文件过大

解决方案:

  • 配置pm2-logrotate模块
  • 设置合理的日志轮转策略
  • 考虑使用外部日志系统,如ELK或Papertrail

问题4: 集群模式下应用状态不一致

解决方案:

  • 使用Redis等外部存储共享状态
  • 确保应用设计为无状态
  • 使用适当的消息传递机制

问题5: 启动后应用不接受连接

解决方案:

  • 使用--wait-ready标志和进程信号
  • 在应用准备好后发送process.send('ready')
  • 增加listen_timeout

参考资源


本文档提供了PM2的主要功能和使用场景的全面概述。随着您的深入使用,建议参考官方文档以获取最新的特性和详细信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值