当前位置: 首页 > ops >正文

1.18 进程管理PM2

在nodejs这章,我们更详细的介绍了http协议,如http post请求上传数据的报文,以及nodejs原生处理该请求.1.11 HTTP 文件上传的核心协议-CSDN博客

http的原理,就是解析 tcp 传过来的请求报文. 根据报文里的路径,匹配 到响应的方法,执行响应方法,返回响应报文.我们看到本质之后,就不会有, 路径 对应 那个方法 的 迷惑.

该篇章完结之前,在介绍一点简单生产环境部署方面的内容.

在生产环境中部署 Node.js 应用需要考虑 性能优化、高可用性、可维护性 和 安全性

一、服务器选型与基础配置

1. 操作系统选择
  • Ubuntu LTS:易用性好,社区支持丰富,适合快速部署。
  • Rocky Linux(推荐)Rocky Linux 由 CentOS 前项目负责人 Gregory Kurtzer 发起,作为 CentOS 的「精神继承者」,Rocky Linux 旨在延续  CentOS 的理念. 虽然Rocky Linux是一个社区驱动的项目,但它提供了许多只有在付费的企业版Linux中才有的特性
  • AlmaLinux:企业级稳定性,适合长期运行的关键业务。
2. 服务器规格建议
  • CPU:根据应用计算复杂度选择,至少 2 核。
  • 内存:至少 4GB(根据应用内存占用调整)。
  • 存储:SSD 硬盘(读写性能对 Node.js 应用至关重要)。

二、Node.js 环境安装

1. 使用 nvm(Node Version Manager)
# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash# 激活 nvm
source ~/.bashrc# 安装 LTS 版本的 Node.js
nvm install --lts# 验证安装
node -v  # 输出 v18.x.x 或 v20.x.x
2. 配置 npm 镜像(国内环境)
npm config set registry https://registry.npmmirror.com

三、应用部署流程

手动部署(适合小型项目)
# 克隆代码到服务器
git clone <repository-url> /var/www/myapp
cd /var/www/myapp# 安装依赖(生产环境跳过 devDependencies)
npm install --production# 构建应用(如需要)
npm run build# 配置环境变量
cp .env.example .env.production
nano .env.production  # 编辑生产环境配置

四、进程管理(PM2)

PM2 是一个强大的 Node.js 进程管理器,专为生产环境设计,提供 自动重启、负载均衡、日志管理、监控 等核心功能:

1. 核心特性

  • 自动重启:崩溃或异常退出时自动重启应用。
  • 集群模式:基于 CPU 核心数自动扩展应用实例。
  • 负载均衡:通过内置负载均衡器分发流量。
  • 日志聚合:统一收集和管理应用日志。
  • 监控系统:实时查看 CPU、内存使用情况。
  • 零停机部署:无缝更新应用代码。

 2.安装 PM2

npm install -g pm2

3.常用命令:

 

 

 

 

 4.配置 PM2 启动脚本

// ecosystem.config.js
module.exports = {apps: [{name: 'my-app',script: 'src/server.js', // 应用入口文件instances: 'max',        // 根据 CPU 核心数自动调整实例数autorestart: true,       // 崩溃自动重启watch: false,            // 生产环境不建议启用监听max_memory_restart: '1G',// 内存超过 1GB 时重启env: {NODE_ENV: 'production',PORT: 3000},env_production: {NODE_ENV: 'production',PORT: 8080},}]
};
 启动应用
# 启动应用
# pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env production# 保存当前进程状态,确保服务器重启后自动恢复
pm2 save# 设置开机自启动
pm2 startup

pm2环境变量加载机制

当你使用PM2启动或重启应用程序时,PM2会根据启动命令中的环境参数选择合适的环境变量集,并将其作为进程的环境变量注入到Node.js进程中。具体来说:

  • 如果你使用命令pm2 start ecosystem.config.js启动应用,默认情况下PM2将使用env字段下定义的环境变量。
  • 若要使用特定环境(比如生产环境)的变量,则可以通过--env参数指定,例如:pm2 start ecosystem.config.js --env production。此时,PM2会选择env_production字段下的环境变量并将其传递给你的应用。

在Node.js中访问环境变量

一旦PM2启动了你的应用程序并将环境变量注入其中,你可以像平常一样通过process.env对象访问这些变量。例如:

console.log(`Running in ${process.env.NODE_ENV} environment`);
console.log(`Using API key: ${process.env.API_KEY}`);

配置文件详解

1. 配置文件生成
pm2 ecosystem          # 生成 ecosystem.config.js
2. 配置文件示例
// ecosystem.config.js
module.exports = {apps: [{name: 'api-server',           // 应用名称script: './src/server.js',    // 入口文件instances: 'max',             // 实例数量exec_mode: 'cluster',         // 集群模式autorestart: true,            // 自动重启watch: false,                 // 监听文件变化(生产环境建议关闭)ignore_watch: ['node_modules', 'logs'], // 忽略监听的目录max_memory_restart: '1G',     // 内存超过 1GB 时重启env: {                        // 环境变量NODE_ENV: 'development',PORT: 3000},env_production: {NODE_ENV: 'production',PORT: 8080},log_date_format: 'YYYY-MM-DD HH:mm:ss', // 日志时间格式error_file: './logs/error.log',         // 错误日志路径out_file: './logs/output.log',          // 输出日志路径merge_logs: true,                      // 合并多实例日志}],};

监控与告警

1. 内置监控面板
pm2 monit  # 查看实时监控面板

总结

PM2 是 Node.js 生产环境中不可或缺的工具,通过 自动化管理、集群扩展、监控告警 等功能,显著提升应用的可靠性和可维护性。

常用命令速查表

# 基础操作
pm2 start app.js -i 0           # 集群模式启动
pm2 monit                       # 监控面板
pm2 logs                        # 查看日志
pm2 reload all                  # 零停机重启# 配置管理
pm2 ecosystem                   # 生成配置文件
pm2 start ecosystem.config.js   # 从配置文件启动# 系统管理
pm2 startup                     # 开机自启动
pm2 save                        # 保存当前状态
pm2 update                      # 更新 PM2
http://www.xdnf.cn/news/14325.html

相关文章:

  • 山东大学项目实训-创新实训-法律文书专家系统-项目报告(六)
  • 【数据结构中的堆】
  • ASR-PRO语音识别可能出现的问题
  • langchain从入门到精通(九)——ChatGPT/Playground手动模拟记忆功能
  • MFE微前端:如何捕捉远程应用的remote.js加载失败的错误?
  • 【人工智能数学基础】测度论
  • 11.OpenCV—联合QT环境配置
  • RTDETRv2 pytorch 官方版自己数据集训练遇到的问题解决
  • 正整数的正向分解
  • 股指期货的多空策略是什么?
  • 编译链接实战(30)strip移除了哪些内容
  • java设计模式[3]之结构性型模式
  • Druid 连接池详解
  • 基于CSO算法的任务卸载在IoT移动边缘计算
  • 绝对收敛 趋于 0 的速度足够快 | 条件收敛 --> 项趋于 0 正负项相互抵消
  • 语言模型的泛化能力和训练数据依赖性
  • Docker -- 快速入门
  • JavaScript 数据结构详解
  • Java垃圾回收机制
  • [NLP]课程期末知识点总结
  • [windows工具]PDFOCR识别导出Excel工具1.1版本使用教程及注意事项
  • 【JVM】- 类加载与字节码结构3
  • 性能优化 - 高级进阶:JVM 常见优化参数
  • Linux内核网络协议的双重注册机制:inet_add_protocol与inet_register_protosw深度解析
  • Python小酷库系列:Python中的JSON工具库(3)
  • 行为设计模式之State(状态)设计模式
  • java中常见的排序算法设计介绍
  • IDEA21中文乱码解决办法
  • ubuntu 22.04设置时区和24小时制显示——筑梦之路
  • 【详细】CUDA开发学习教程清单