PM2工程化实战:从配置文件到日志管理的完整解决方案
在Node.js生产环境部署中,PM2早已成为标配工具。但大多数开发者仅仅停留在
pm2 start app.js
的基础用法,未能充分发挥其作为进程管理器的完整能力。本文将带你超越基础命令,构建一套符合工程化标准的PM2部署方案。
1. 理解PM2的核心价值
PM2绝不仅仅是一个进程启动器,它提供了完整的应用生命周期管理能力。以下是PM2的核心优势:
- 进程守护 :自动重启崩溃的应用
- 负载均衡 :支持集群模式启动多个实例
- 日志管理 :集中收集和轮转应用日志
- 监控集成 :内置性能监控和报警功能
- 零停机部署 :支持无缝重启和回滚
// 基础PM2启动命令
pm2 start app.js -i max // 以集群模式启动
提示:在生产环境中,直接使用命令行参数启动PM2会导致配置难以维护,推荐使用配置文件管理所有参数。
2. 工程化配置:ecosystem.config.js详解
配置文件是PM2工程化实践的核心。通过
ecosystem.config.js
,我们可以将各种环境参数和启动选项集中管理。
2.1 生成和结构解析
首先生成基础配置文件:
pm2 init simple
生成的配置文件包含以下核心字段:
| 字段名 | 描述 | 示例值 |
|---|---|---|
| name | 应用名称 | "my-app" |
| script | 入口文件路径 | "./app.js" |
| instances | 实例数量 | "max" |
| exec_mode | 执行模式 | "cluster" |
| env | 公共环境变量 | {NODE_ENV: "development"} |
| env_production | 生产环境变量 | {NODE_ENV: "production"} |
2.2 高级配置选项
一个完整的生产级配置应该包含以下内容:
module.exports = {
apps: [{
name: "api-server",
script: "./src/server.js",
instances: "max",
exec_mode: "cluster",
max_memory_restart: "1G",
min_uptime: "60s",
kill_timeout: 3000,
listen_timeout: 5000,
env: {
NODE_ENV: "development",
PORT: 3000
},
env_production: {
NODE_ENV: "production",
PORT: 80
},
log_date_format: "YYYY-MM-DD HH:mm Z",
error_file: "/var/log/pm2/api-error.log",
out_file: "/var/log/pm2/api-out.log",
combine_logs: true,
merge_logs: true,
autorestart: true,
watch: false,
ignore_watch: ["node_modules", ".git"]
}]
}
注意:生产环境务必设置
watch: false,否则文件变更会导致意外重启。
3. 环境管理与部署策略
3.1 多环境配置管理
实际项目中,我们需要区分开发、测试和生产环境:
module.exports = {
apps: [{
name: "app",
script: "./app.js",
// 公共配置
env: {
COMMON_VAR: "value",
NODE_ENV: "development"
},
env_test: {
NODE_ENV: "test",
DB_HOST: "test.db.example.com"
},
env_production: {
NODE_ENV: "production",
DB_HOST: "prod.db.example.com"
}
}]
}
启动不同环境:
pm2 start ecosystem.config.js --env production
3.2 部署最佳实践
- 分离配置与代码 :使用环境变量管理敏感信息
- 设置资源限制 :防止内存泄漏导致系统崩溃
- 禁用文件监听 :生产环境不应使用watch模式
- 配置日志轮转 :防止日志文件占用过多磁盘空间
# 安装日志轮转插件
pm2 install pm2-logrotate
# 配置日志轮转
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
4. 高级日志管理技巧
PM2提供了强大的日志管理功能,但需要正确配置才能发挥最大价值。
4.1 日志配置详解
在配置文件中,可以精细控制日志行为:
{
error_file: "/var/log/app/err.log", // 错误日志路径
out_file: "/var/log/app/out.log", // 标准输出日志路径
log_date_format: "YYYY-MM-DD HH:mm", // 日志时间格式
combine_logs: true, // 合并集群实例日志
merge_logs: true, // 合并不同应用的日志
pid_file: "/var/run/app.pid", // PID文件路径
}
4.2 日志查看与分析
常用日志操作命令:
# 查看实时日志
pm2 logs
# 查看特定应用的日志
pm2 logs app-name
# 查看最后100行日志
pm2 logs --lines 100
# 清空日志
pm2 flush
# 以JSON格式输出日志
pm2 logs --json
对于生产环境,建议将日志接入ELK或类似系统进行集中管理。
5. 进程管理与维护
5.1 常用进程操作
| 命令 | 描述 | 示例 |
|---|---|---|
| start | 启动应用 |
pm2 start app.js
|
| stop | 停止应用 |
pm2 stop app-name
|
| restart | 重启应用 |
pm2 restart app-name
|
| delete | 删除应用 |
pm2 delete app-name
|
| reload | 零停机重载 |
pm2 reload app-name
|
| scale | 调整实例数 |
pm2 scale app-name +1
|
5.2 监控与性能调优
PM2内置了监控功能:
# 查看应用状态
pm2 monit
# 生成性能快照
pm2 profile
# 生成CPU和内存使用报告
pm2 report
对于性能敏感的应用,可以调整以下参数:
{
max_memory_restart: "1G", // 内存超过1G时重启
node_args: "--max-old-space-size=4096", // 设置Node内存限制
cron_restart: "0 3 * * *" // 每天凌晨3点重启
}
6. 实战:构建生产级部署方案
让我们通过一个电商后台API的实际案例,整合前面介绍的各种技术。
6.1 项目结构
├── ecosystem.config.js
├── package.json
├── src
│ ├── server.js
│ ├── config
│ │ ├── development.json
│ │ └── production.json
│ └── ...
└── logs
├── pm2
│ ├── error.log
│ └── output.log
└── app
├── access.log
└── error.log
6.2 完整配置文件
module.exports = {
apps: [{
name: "ecommerce-api",
script: "./src/server.js",
instances: 4,
exec_mode: "cluster",
max_memory_restart: "800M",
min_uptime: "60s",
kill_timeout: 5000,
listen_timeout: 10000,
env: {
NODE_ENV: "development",
CONFIG_FILE: "./config/development.json"
},
env_production: {
NODE_ENV: "production",
CONFIG_FILE: "./config/production.json"
},
error_file: "./logs/pm2/error.log",
out_file: "./logs/pm2/output.log",
log_date_format: "YYYY-MM-DD HH:mm:ss",
combine_logs: true,
merge_logs: true,
autorestart: true,
watch: false,
ignore_watch: ["node_modules", "logs", ".git"],
instance_var: "INSTANCE_ID"
}]
}
6.3 部署脚本
#!/bin/bash
# 安装依赖
npm install --production
# 启动PM2
pm2 start ecosystem.config.js --env production
# 设置开机自启
pm2 startup
pm2 save
# 安装日志轮转
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
echo "部署完成"
在实际项目中,我们还需要考虑以下优化点:
-
使用
NODE_OPTIONS配置V8引擎参数 -
设置适当的
UV_THREADPOOL_SIZE -
配置
source-map-support以便更好的错误追踪 - 集成APM工具进行性能监控
通过这套方案,我们实现了从简单进程启动到完整生产级部署的跨越。PM2的强大功能在合理配置下,能够显著提升Node.js应用的稳定性和可维护性。

1908

被折叠的 条评论
为什么被折叠?



