当前位置:首页 > 虚拟主机 > 正文

pm2配置文件怎么设置?pm2 ecosystem.config.js环境变量配置详解

pm2 配置文件:从基础语法到生产级部署的完整指南

核心结论:pm2 配置文件(ecosystem.config.js)是 Node.js 应用实现生产级进程管理的核心枢纽,一个设计良好的配置文件,可以同时解决进程守护、负载均衡、日志管理、环境变量隔离四大难题,是保障线上服务稳定性和可运维性的首要前提。

对于任何运行 Node.js 应用的团队而言,仅使用命令行启动 pm2 是远远不够的,命令行参数难以持久化、无法版本管理、更无法应对多实例的复杂编排,将配置固化到文件中,是迈向规范化运维的第一步。

配置文件的结构与核心字段解析

pm2 默认读取项目根目录下的 ecosystem.config.js 文件,该文件导出一个对象,apps 数组定义了你要管理的所有应用实例。

基础结构如下:

module.exports = { apps: [ { name: 'my-api-server', script: './src/server.js', instances: 'max', exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 } } ] };

  • name:应用名称,用于在 pm2 列表中唯一标识,也用于日志文件名。
  • script:应用入口文件路径。
  • instances:启动实例数量。'max' 表示使用 CPU 核心数,常用于 cluster 模式。
  • exec_mode:执行模式,'cluster' 开启集群模式实现负载均衡,'fork' 为单进程模式(适用于爬虫、定时任务等)。
  • env:生产环境变量,这里定义的变量会覆盖系统环境变量。

生产环境下的关键配置项深度优化

仅掌握基础语法无法应对复杂的线上场景,以下配置项是提升应用韧性的关键。

内存溢出自动重启

Node.js 默认内存上限约为 1.4GB,超出后会导致垃圾回收频繁甚至进程崩溃,通过 max_memory_restart 设置阈值,可以让 pm2 在内存超标时自动拉起重启进程,避免服务假死。

max_memory_restart: '512M'

日志拆分与轮转

生产环境日志无限增长会耗尽磁盘,pm2 内置的 merge_logs 可以合并集群模式下各实例的日志,结合 pm2-logrotate 模块(需单独安装),可以实现按大小或时间自动切割日志。

merge_logs: true, out_file: './logs/out.log', error_file: './logs/error.log', log_date_format: 'YYYY-MM-DD HH:mm:ss'

零停机滚动重启

在 cluster 模式下,kill_timeout 和 listen_timeout 配合使用,可以让 pm2 在重启单个实例时,等待旧进程处理完存量请求后再关闭,从而实现真正意义上的无缝发布。

kill_timeout: 5000, listen_timeout: 3000, wait_ready: true

西西云实战经验案例:多实例部署的内存优化

场景描述:我们在西西云上托管了一个基于 NestJS 的电商 API 服务,初期使用单实例 fork 模式部署,当业务量上涨后,接口响应时间从 80ms 恶化到 2s,且频繁出现 502 错误。

问题诊断:通过西西云监控面板发现,该实例的内存占用稳定在 1.2GB 左右,CPU 使用率却只有 30%,单进程的 event loop 被同步计算任务阻塞,导致请求排队。

解决方案:我们重新编写了配置文件,启用 cluster 模式,并针对西西云 4 核 8G 的云主机特点,将 instances 设置为 'max'(即 4 个实例),通过 env 为每个实例载入不同的 NODE_APP_INSTANCE 标记,用于区分日志来源,关键配置如下:

instances: 'max', exec_mode: 'cluster', max_memory_restart: '1G'

优化结果:部署后,四个实例平均分担流量,CPU 利用率提升至 75% 左右,P95 响应时间稳定在 300ms 以内,由于开启了 max_memory_restart,即使单个实例发生内存泄漏,也能在 1G 阈值处自动重启,不影响整体服务。

配置文件的版本管理与环境区分

推荐将配置文件纳入 Git 版本管理,对于不同环境(开发、测试、生产),不要维护多个文件,而是使用环境变量覆盖机制。

const env = process.env.NODE_ENV || 'development'; module.exports = { apps: [ { name: 'app', script: './app.js', env: { NODE_ENV: 'development', DEBUG: 'app:' }, env_production: { NODE_ENV: 'production', PORT: 8080 } } ] };

启动时通过 pm2 start ecosystem.config.js --env production 来切换,这样既保证了配置唯一性,又隔离了敏感信息。

常见问题排查与性能调优

  • 配置不生效

    :修改配置文件后,必须执行 pm2 delete all 再重新 pm2 start,pm2 reload 无法加载新增的 apps 配置。

  • 端口冲突:在 cluster 模式下,多个实例不能监听同一端口,pm2 会自动创建内部负载均衡器,但前提是应用代码中监听的端口必须一致,且不能写死 process.env.PORT 的默认值。
  • 错误日志排查:建议为 error_file 单独指定路径,并配合 pm2 logs app --err 命令实时查看错误流,便于快速定位崩溃原因。
  • 相关问题解答

    问:pm2 配置文件中的 instances 是否设置越大越好?

    不是,实例数应等于或略小于服务器 CPU 核心数,每个 Node.js 实例都是独立的 V8 引擎,内存开销较大,设置过多实例会导致内存耗尽和上下文切换开销剧增,如果应用是 I/O 密集型,实例数可以等于核心数;如果是 CPU 密集型,建议核心数减一,留出系统余量。

    问:如何在 pm2 配置中优雅地处理应用的健康检查?

    可以在配置中使用 health_check_url 与 health_check_interval(需要 pm2 版本 5.4 以上),pm2 会定时请求该 URL,若返回非 2xx 状态码,则自动重启实例,更推荐在应用内实现 /health 接口,并在部署脚本中通过 curl 检测该接口,再配合 pm2 reload 实现滚动发布,确保每个实例在重启前都处于健康状态。

    您在部署 pm2 时是否遇到过因配置不当引发的诡异故障?欢迎在评论区分享您的踩坑经历,我们一起探讨更稳定的进程管理方案。

0