PM2是一款广泛应用于Node.js项目生产环境的进程管理工具,可以帮助开发者实现应用守护、自动重启、负载均衡、日志管理以及开机自启动等功能。相比直接使用node命令启动应用,PM2通过配置文件统一管理应用运行参数,使部署流程更加规范,也方便后期维护。
PM2配置文件是生产环境部署中的核心组成部分,通过配置文件可以定义应用名称、启动脚本、运行模式、环境变量、日志路径、实例数量等信息。合理编写PM2配置文件,不仅能够提升应用稳定性,还能降低服务器运维成本。
PM2配置文件的基本介绍
PM2支持通过配置文件管理多个Node.js应用,常见配置文件名称包括:
Bashecosystem.config.js
该文件通常放置在项目根目录中,通过以下命令生成:
Bashpm2 ecosystem
执行后会生成一个默认的配置模板:
JavaScriptmodule.exports = { apps: [] }
开发者可以根据项目需求修改apps数组中的配置项。
启动配置文件:
Bashpm2 start ecosystem.config.js
PM2会读取配置文件中的参数,并按照定义启动应用。
PM2配置文件基础结构
一个完整的PM2配置文件通常包含以下结构:
JavaScriptmodule.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用于标识当前运行的服务:
JavaScriptname: "website-api"
查看PM2进程列表时:
Bashpm2 list
显示的名称就是该配置项。
合理设置应用名称可以方便管理多个项目,例如:
JavaScriptname: "user-service" name: "order-service" name: "payment-service"
不同业务服务可以通过名称快速定位。
script:指定启动文件
script用于指定Node.js入口文件:
JavaScriptscript: "./server.js"
例如项目结构:
project ├── ecosystem.config.js ├── server.js └── package.json
配置:
JavaScriptscript: "server.js"
PM2启动后会执行:
Bashnode server.js
instances:设置应用实例数量
instances用于控制启动多少个进程:
JavaScriptinstances: 4
也可以使用CPU核心数自动分配:
JavaScriptinstances: "max"
例如服务器有8个CPU核心:
JavaScriptinstances: "max"
PM2会启动8个实例,提高并发处理能力。
exec_mode:选择运行模式
PM2主要支持两种运行模式:
fork模式
默认模式:
JavaScriptexec_mode: "fork"
特点:
-
一个应用对应一个进程。
-
适合普通后台服务。
-
配置简单,资源占用较低。
cluster模式
集群模式:
JavaScriptexec_mode: "cluster"
通常配合:
JavaScriptinstances: "max"
使用。
示例:
JavaScriptmodule.exports = { apps: [ { name: "api-server", script: "./app.js", instances: "max", exec_mode: "cluster" } ] }
cluster模式利用Node.js多进程能力,可以充分使用多核CPU。
环境变量配置
生产项目通常需要区分开发环境和正式环境。
PM2支持多个环境配置:
JavaScriptmodule.exports = { apps: [ { name: "web-app", script: "./app.js", env: { NODE_ENV: "development", PORT: 3000 }, env_production: { NODE_ENV: "production", PORT: 8080 } } ] }
开发环境启动:
Bashpm2 start ecosystem.config.js
生产环境启动:
Bashpm2 start ecosystem.config.js --env production
代码中可以通过:
JavaScriptprocess.env.NODE_ENV
获取当前环境。
日志文件配置
PM2默认会保存应用日志,但生产环境通常需要指定日志路径。
示例:
JavaScriptmodule.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:日志时间格式。
查看日志:
Bashpm2 logs api
清空日志:
Bashpm2 flush
自动重启配置
生产环境中应用可能因为异常退出,需要自动恢复。
PM2提供多种重启策略。
设置最大重启次数
JavaScriptmax_restarts: 10
超过次数后停止重启,避免异常服务无限循环。
设置异常重启延迟
JavaScriptrestart_delay: 5000
单位为毫秒。
表示应用崩溃后等待5秒再重新启动。
内存超限自动重启
Node.js长期运行可能出现内存增长,可以配置:
JavaScriptmax_memory_restart: "500M"
当进程占用内存超过500MB时,PM2会自动重启。
完整示例:
JavaScript{ name: "node-api", script: "./app.js", max_memory_restart: "500M", restart_delay: 3000 }
文件监听watch配置
开发阶段经常需要代码修改后自动重启:
JavaScriptwatch: true
例如:
JavaScript{ script: "./app.js", watch: true }
但是生产环境通常关闭:
JavaScriptwatch: false
原因:
-
文件变化可能导致频繁重启。
-
大型项目扫描文件会增加服务器压力。
可以通过忽略目录减少监听范围:
JavaScriptwatch_options: { followSymlinks: false }
设置开机自动启动
PM2部署服务器后,需要设置开机自动运行:
生成启动脚本:
Bashpm2 startup
保存当前进程列表:
Bashpm2 save
服务器重启后,PM2会自动恢复之前运行的应用。
查看保存列表:
Bashpm2 resurrect
多项目PM2配置示例
实际生产环境中,一个服务器可能运行多个Node.js服务:
JavaScriptmodule.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
生产环境建议:
JavaScriptwatch:false
避免无意义重启。
3. 合理设置实例数量
并不是实例越多越好。
建议:
-
CPU核心较少:instances=CPU核心数。
-
内存较小:减少实例数量。
-
IO密集型服务:适当增加实例。
4. 配合日志轮转
长期运行的服务会产生大量日志,可以安装:
Bashpm2 install pm2-logrotate
查看:
Bashpm2 module:list
避免日志文件无限增长。
5. 使用版本控制管理配置
ecosystem.config.js属于项目部署文件,建议提交到Git:
git add ecosystem.config.js git commit -m "add pm2 config"
方便不同服务器快速部署。
常见PM2配置问题排查
PM2启动后环境变量不存在
检查启动方式:
错误:
Bashpm2 start ecosystem.config.js
生产环境应该:
Bashpm2 start ecosystem.config.js --env production
修改配置后没有生效
修改配置文件后需要重新加载:
Bashpm2 reload ecosystem.config.js
或者:
Bashpm2 restart app-name
集群模式端口冲突
cluster模式下多个实例共享端口,不需要修改:
JavaScriptPORT=3000
如果每个实例使用不同端口,则需要调整应用设计。
PM2保存失败
执行:
Bashpm2 save
确认当前用户具有权限,并检查:
Bashpm2 startup
生成的系统启动命令是否执行完成。
总结
PM2配置文件是Node.js应用生产部署的重要工具,通过ecosystem.config.js可以统一管理应用启动参数、运行模式、环境变量、日志、自动重启策略以及服务器启动恢复机制。
合理配置PM2不仅可以提高Node.js服务的稳定性,还能够简化多项目部署和日常运维工作。对于需要长期运行的API服务、后台任务、Web应用等项目,掌握PM2配置文件编写方式,是构建可靠生产环境的重要技能。