首页 / 资讯中心 / 文章详情

PM2 进程管理:Node.js 高可用与性能优化实战

PM2 进程管理:Node.js 高可用与性能优化实战 ★ FEATURED ARTICLE
1. PM2 是什么为什么 Node.js 开发者离不开它第一次接触 PM2 是在 2016 年维护一个电商后台系统时。当时我们的 Node.js 服务经常因为内存泄漏崩溃半夜被报警叫醒成了家常便饭。直到团队里一位资深工程师扔给我一行命令npm install pm2 -g从此我的运维生活发生了翻天覆地的变化。PM2 本质上是一个 Node.js 应用的进程管理器Process Manager但它解决的问题远不止保持应用在线这么简单。想象一下你正在运营一个在线教育平台暑假促销期间流量暴涨三倍传统方式下你需要手动启动多个实例、配置负载均衡、设置日志分割...而 PM2 用一行命令就能搞定所有这些运维需求。与传统的 nohup 或 forever 相比PM2 的核心优势在于其完整的应用生命周期管理能力。我统计过团队使用前后的对比数据应用平均无故障时间从 58 小时提升到 720 小时故障恢复时间从 15 分钟缩短到 30 秒内。这些提升主要来自三个关键技术特性集群模式Cluster Mode自动利用多核 CPU无需修改代码即可实现负载均衡零秒重载Zero Downtime Reload更新代码时保持服务不间断监控仪表盘Monitoring Dashboard实时查看应用性能指标重要提示虽然 PM2 常用于 Node.js但它其实能管理任何类型的进程。我曾用它成功管理过 Python 脚本和 Java 服务只需要在启动时指定解释器路径即可。2. 从安装到生产PM2 完整配置指南2.1 环境准备与安装在 Ubuntu 22.04 上的安装示例其他系统类似# 使用 nvm 管理 Node.js 版本避免权限问题 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash nvm install 18.16.0 # 当前 LTS 版本 nvm use 18.16.0 # 全局安装 PM2 npm install pm2latest -g # 验证安装 pm2 --version常见安装问题解决方案权限错误永远不要用 sudo 安装 npm 包建议使用 nvm 或修改 npm 默认目录Node.js 版本冲突用 nvm 管理多版本确保开发和生产环境一致Windows 系统问题建议使用 WSL2 获得完整 Linux 环境2.2 基础命令速查表命令作用常用参数pm2 start app.js启动应用--nameapi指定名称pm2 list查看进程列表--sortmemory按内存排序pm2 logs查看日志--lines 200显示行数pm2 stop all停止所有应用id停止指定应用pm2 delete all删除所有应用id删除指定应用pm2 restart all重启所有应用--update-env更新环境变量2.3 生产环境推荐配置创建 ecosystem.config.js 文件是专业用法module.exports { apps: [{ name: api-server, script: ./dist/index.js, instances: max, // 使用所有CPU核心 exec_mode: cluster, // 集群模式 autorestart: true, // 崩溃自动重启 max_memory_restart: 1G, // 内存超过1G重启 env: { NODE_ENV: development, }, env_production: { NODE_ENV: production, PORT: 3040, } }] }启动时使用pm2 start ecosystem.config.js --env production3. 高级运维技巧与实战经验3.1 日志管理最佳实践PM2 默认会把日志存储在~/.pm2/logs但生产环境需要更专业的方案日志分割配置pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB pm2 set pm2-logrotate:retain 30 # 保留30个日志文件集成 ELK 栈# 安装 PM2 的 ELK 输出模块 pm2 install pm2-elasticsearch实时日志追踪技巧# 只显示错误日志 pm2 logs --err # 监控特定应用的日志 pm2 logs api-server --lines 1003.2 性能监控与调优PM2 内置监控系统非常强大pm2 monit # 打开实时监控面板关键指标解读内存泄漏检测如果内存曲线持续上升不回落很可能存在泄漏CPU 使用率集群模式下观察各实例负载是否均衡事件循环延迟超过 100ms 就需要优化代码我常用的性能分析命令# 生成 CPU 分析文件 pm2 trigger app-name 0x500 # 生成内存快照 pm2 trigger app-name 0x2003.3 集群模式深度优化当你的应用需要处理高并发时cluster 模式是必选项。但要注意会话保持问题// 使用 Redis 存储 session const session require(express-session); const RedisStore require(connect-redis)(session); app.use(session({ store: new RedisStore({ client: redisClient }), secret: your-secret, resave: false }));端口绑定技巧// 在 Express 中正确处理集群端口 const cluster require(cluster); const PORT process.env.PORT || 3000; if (cluster.isMaster) { console.log(Master ${process.pid} is running); // 启动工作进程 for (let i 0; i numCPUs; i) { cluster.fork(); } } else { app.listen(PORT, () { console.log(Worker ${process.pid} started on port ${PORT}); }); }4. 生产环境常见问题解决方案4.1 启动失败排查流程检查基础依赖node -v npm -v pm2 -v查看详细错误pm2 logs --lines 200常见错误代码ENOENT文件路径错误EADDRINUSE端口被占用EACCES权限不足4.2 内存泄漏处理方案典型症状PM2 频繁重启监控显示内存持续增长排查步骤生成内存快照pm2 trigger app-name 0x200使用 Chrome DevTools 分析node --inspect-brk app.js常见泄漏原因全局变量累积未清除的定时器未关闭的数据库连接4.3 零停机部署实践标准部署流程# 1. 拉取最新代码 git pull origin main # 2. 安装依赖 npm install --production # 3. 重新启动 pm2 reload all --update-env高级技巧 - 蓝绿部署// ecosystem.config.js module.exports { apps: [{ name: api-blue, script: ./app.js, env: { DEPLOYMENT: blue, PORT: 3000 } },{ name: api-green, script: ./app.js, env: { DEPLOYMENT: green, PORT: 3001 } }] }切换流量时pm2 stop api-blue pm2 start api-green5. 与现代化运维体系集成5.1 Docker 集成方案最佳实践 DockerfileFROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm install --production COPY . . # 安装 PM2 全局 RUN npm install pm2 -g # 启动命令 CMD [pm2-runtime, ecosystem.config.js]关键点使用pm2-runtime替代直接启动保持单进程原则一个容器一个应用正确处理 SIGTERM 信号5.2 Kubernetes 部署策略PM2 在 K8s 中的角色转变不再需要集群模式由 K8s 处理扩缩容推荐单进程运行使用 readiness/liveness 探针示例 deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: node-api spec: replicas: 3 template: spec: containers: - name: app image: your-image ports: - containerPort: 3000 livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 30 periodSeconds: 105.3 监控告警体系搭建推荐监控方案组合PM2 内置指标 Prometheuspm2 install pm2-prometheus-exporter告警规则示例PromQL# 内存使用超过 80% pm2_process_memory_usage{appapi-server} 0.8 # 进程离线 pm2_process_status{appapi-server} 0集成 Grafana 仪表盘# 使用现成的 PM2 仪表盘模板 ID: 10991在过去的运维生涯中我发现 PM2 最容易被低估的功能其实是它的模块系统。通过 pm2 install 可以轻松扩展功能比如pm2-logrotate日志轮转pm2-server-monit服务器监控pm2-webshell网页终端最后分享一个真实案例某次大促前我们通过 PM2 的动态扩容功能在 1 分钟内将处理能力提升了 4 倍。命令很简单pm2 scale api-server 4这种灵活性是传统运维工具难以企及的。
阅读完成 · 觉得有帮助?
咨询建站