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