PM2配置文件详解与部署实践

8 次阅读

PM2是一款广泛应用于Node.js项目生产环境的进程管理工具,可以帮助开发者实现应用守护、自动重启、负载均衡、日志管理以及开机自启动等功能。相比直接使用node命令启动应用,PM2通过配置文件统一管理应用运行参数,使部署流程更加规范,也方便后期维护。

PM2配置文件是生产环境部署中的核心组成部分,通过配置文件可以定义应用名称、启动脚本、运行模式、环境变量、日志路径、实例数量等信息。合理编写PM2配置文件,不仅能够提升应用稳定性,还能降低服务器运维成本。

PM2配置文件的基本介绍

PM2支持通过配置文件管理多个Node.js应用,常见配置文件名称包括:

Bash
ecosystem.config.js

该文件通常放置在项目根目录中,通过以下命令生成:

Bash
pm2 ecosystem

执行后会生成一个默认的配置模板:

JavaScript
module.exports = {
  apps: []
}

开发者可以根据项目需求修改apps数组中的配置项。

启动配置文件:

Bash
pm2 start ecosystem.config.js

PM2会读取配置文件中的参数,并按照定义启动应用。

PM2配置文件基础结构

一个完整的PM2配置文件通常包含以下结构:

JavaScript
module.exports = {
  apps: [
    {
      name: "my-app",
      script: "./app.js",
      instances: 1,
      exec_mode: "fork",
      watch: false,
      env: {
        NODE_ENV: "development"
      },
      env_production: {
        NODE_ENV: "production"
      }
    }
  ]
}

其中:

  • apps:应用配置列表,可以配置多个服务。

  • name:应用名称,用于PM2管理和查看。

  • script:应用启动入口文件。

  • instances:启动实例数量。

  • exec_mode:运行模式。

  • watch:是否监听文件变化。

  • env:默认环境变量。

  • env_production:生产环境变量。

常用PM2配置参数详解

name:设置应用名称

name用于标识当前运行的服务:

JavaScript
name: "website-api"

查看PM2进程列表时:

Bash
pm2 list

显示的名称就是该配置项。

合理设置应用名称可以方便管理多个项目,例如:

JavaScript
name: "user-service"
name: "order-service"
name: "payment-service"

不同业务服务可以通过名称快速定位。


script:指定启动文件

script用于指定Node.js入口文件:

JavaScript
script: "./server.js"

例如项目结构:

project
 ├── ecosystem.config.js
 ├── server.js
 └── package.json

配置:

JavaScript
script: "server.js"

PM2启动后会执行:

Bash
node server.js

instances:设置应用实例数量

instances用于控制启动多少个进程:

JavaScript
instances: 4

也可以使用CPU核心数自动分配:

JavaScript
instances: "max"

例如服务器有8个CPU核心:

JavaScript
instances: "max"

PM2会启动8个实例,提高并发处理能力。


exec_mode:选择运行模式

PM2主要支持两种运行模式:

fork模式

默认模式:

JavaScript
exec_mode: "fork"

特点:

  • 一个应用对应一个进程。

  • 适合普通后台服务。

  • 配置简单,资源占用较低。

cluster模式

集群模式:

JavaScript
exec_mode: "cluster"

通常配合:

JavaScript
instances: "max"

使用。

示例:

JavaScript
module.exports = {
  apps: [
    {
      name: "api-server",
      script: "./app.js",
      instances: "max",
      exec_mode: "cluster"
    }
  ]
}

cluster模式利用Node.js多进程能力,可以充分使用多核CPU。


环境变量配置

生产项目通常需要区分开发环境和正式环境。

PM2支持多个环境配置:

JavaScript
module.exports = {
  apps: [
    {
      name: "web-app",
      script: "./app.js",

      env: {
        NODE_ENV: "development",
        PORT: 3000
      },

      env_production: {
        NODE_ENV: "production",
        PORT: 8080
      }
    }
  ]
}

开发环境启动:

Bash
pm2 start ecosystem.config.js

生产环境启动:

Bash
pm2 start ecosystem.config.js --env production

代码中可以通过:

JavaScript
process.env.NODE_ENV

获取当前环境。


日志文件配置

PM2默认会保存应用日志,但生产环境通常需要指定日志路径。

示例:

JavaScript
module.exports = {
  apps: [
    {
      name: "api",
      script: "./app.js",

      error_file: "./logs/error.log",
      out_file: "./logs/output.log",
      log_date_format: "YYYY-MM-DD HH:mm:ss"
    }
  ]
}

参数说明:

  • error_file:错误日志文件。

  • out_file:标准输出日志。

  • log_date_format:日志时间格式。

查看日志:

Bash
pm2 logs api

清空日志:

Bash
pm2 flush

自动重启配置

生产环境中应用可能因为异常退出,需要自动恢复。

PM2提供多种重启策略。

设置最大重启次数

JavaScript
max_restarts: 10

超过次数后停止重启,避免异常服务无限循环。


设置异常重启延迟

JavaScript
restart_delay: 5000

单位为毫秒。

表示应用崩溃后等待5秒再重新启动。


内存超限自动重启

Node.js长期运行可能出现内存增长,可以配置:

JavaScript
max_memory_restart: "500M"

当进程占用内存超过500MB时,PM2会自动重启。

完整示例:

JavaScript
{
  name: "node-api",
  script: "./app.js",
  max_memory_restart: "500M",
  restart_delay: 3000
}

文件监听watch配置

开发阶段经常需要代码修改后自动重启:

JavaScript
watch: true

例如:

JavaScript
{
  script: "./app.js",
  watch: true
}

但是生产环境通常关闭:

JavaScript
watch: false

原因:

  • 文件变化可能导致频繁重启。

  • 大型项目扫描文件会增加服务器压力。

可以通过忽略目录减少监听范围:

JavaScript
watch_options: {
  followSymlinks: false
}

设置开机自动启动

PM2部署服务器后,需要设置开机自动运行:

生成启动脚本:

Bash
pm2 startup

保存当前进程列表:

Bash
pm2 save

服务器重启后,PM2会自动恢复之前运行的应用。

查看保存列表:

Bash
pm2 resurrect

多项目PM2配置示例

实际生产环境中,一个服务器可能运行多个Node.js服务:

JavaScript
module.exports = {
  apps: [

    {
      name: "frontend",
      script: "./frontend/server.js",
      instances: 2,
      exec_mode: "cluster",
      env_production: {
        NODE_ENV: "production"
      }
    },

    {
      name: "backend-api",
      script: "./backend/app.js",
      instances: "max",
      exec_mode: "cluster",
      max_memory_restart: "1G",
      env_production: {
        NODE_ENV: "production",
        PORT: 8080
      }
    }

  ]
}

通过一个配置文件即可管理多个服务。


PM2部署最佳实践

1. 使用固定项目目录

建议服务器目录结构:

/data/apps
 ├── api
 │   ├── app.js
 │   └── ecosystem.config.js
 └── web
     ├── server.js
     └── ecosystem.config.js

方便维护和发布。


2. 生产环境关闭watch

生产环境建议:

JavaScript
watch:false

避免无意义重启。


3. 合理设置实例数量

并不是实例越多越好。

建议:

  • CPU核心较少:instances=CPU核心数。

  • 内存较小:减少实例数量。

  • IO密集型服务:适当增加实例。


4. 配合日志轮转

长期运行的服务会产生大量日志,可以安装:

Bash
pm2 install pm2-logrotate

查看:

Bash
pm2 module:list

避免日志文件无限增长。


5. 使用版本控制管理配置

ecosystem.config.js属于项目部署文件,建议提交到Git:

git add ecosystem.config.js
git commit -m "add pm2 config"

方便不同服务器快速部署。


常见PM2配置问题排查

PM2启动后环境变量不存在

检查启动方式:

错误:

Bash
pm2 start ecosystem.config.js

生产环境应该:

Bash
pm2 start ecosystem.config.js --env production

修改配置后没有生效

修改配置文件后需要重新加载:

Bash
pm2 reload ecosystem.config.js

或者:

Bash
pm2 restart app-name

集群模式端口冲突

cluster模式下多个实例共享端口,不需要修改:

JavaScript
PORT=3000

如果每个实例使用不同端口,则需要调整应用设计。


PM2保存失败

执行:

Bash
pm2 save

确认当前用户具有权限,并检查:

Bash
pm2 startup

生成的系统启动命令是否执行完成。


总结

PM2配置文件是Node.js应用生产部署的重要工具,通过ecosystem.config.js可以统一管理应用启动参数、运行模式、环境变量、日志、自动重启策略以及服务器启动恢复机制。

合理配置PM2不仅可以提高Node.js服务的稳定性,还能够简化多项目部署和日常运维工作。对于需要长期运行的API服务、后台任务、Web应用等项目,掌握PM2配置文件编写方式,是构建可靠生产环境的重要技能。