如何优化 Node.js 生产基础设施: 2025的最佳实践
Node.js 生产部署最佳实践来自我们经过实践检验的基础架构,该基础架构每天可处理数百万个请求。
在 Forward Email,我们花费了数年时间完善 Node.js 生产环境的搭建。本指南全面分享了我们久经考验的 Node.js 生产部署最佳实践,重点介绍性能优化、监控以及我们在扩展 Node.js 应用程序以处理每日数百万笔交易过程中积累的经验教训。
我们的单核性能优化革命达到 573%
当我们从英特尔迁移到 AMD Ryzen 处理器时,我们实现了 性能提升 573% 在我们的 Node.js 应用程序中。这不仅仅是一个小小的优化,它从根本上改变了我们的 Node.js 应用程序在生产环境中的性能,并证明了单核性能优化对于任何 Node.js 应用程序的重要性。
[!TIP] 对于 Node.js 生产部署的最佳实践,硬件选择至关重要。我们特意选择了 DataPacket 托管服务,因为他们支持 AMD Ryzen 处理器,因为 JavaScript 执行是单线程的,所以单核性能对于 Node.js 应用程序至关重要。
为什么单核性能优化对 Node.js 如此重要
我们从 Intel 迁移到 AMD Ryzen 的结果是:
- 性能提升 573% 在请求处理中(记录在 我们的状态页面的 GitHub 问题 #1519)
- 消除处理延迟 几乎即时的响应(在 GitHub 问题 #298)
- 更好的性价比 适用于 Node.js 生产环境
- 缩短响应时间 覆盖我们所有的应用程序端点
性能提升非常显著,我们现在认为 AMD Ryzen 处理器对于任何严肃的 Node.js 生产部署都至关重要,无论您运行的是 Web 应用程序、API、微服务还是任何其他 Node.js 工作负载。
相关内容
有关我们的基础设施选择的更多详细信息,请查看:
- 最佳电子邮件转发服务 - 性能比较
- 自托管解决方案 - 硬件建议
Node.js 生产环境设置:我们的技术栈
我们的 Node.js 生产部署最佳实践包含基于多年生产经验的精心技术选择。以下是我们使用的技术以及这些选择适用于任何 Node.js 应用程序的原因:
包管理器:pnpm,提高生产效率
我们使用的内容: pnpm
(固定版本)
我们选择 pnpm 而不是 npm 和 yarn 作为我们的 Node.js 生产环境设置,因为:
- 安装时间更快 在 CI/CD 管道中
- 磁盘空间效率 通过硬链接
- 严格的依赖解析 防止幻影依赖
- 更好的性能 在生产部署中
[!NOTE] 作为 Node.js 生产部署最佳实践的一部分,我们固定了 pnpm 等关键工具的确切版本,以确保所有环境和团队成员的机器上的行为一致。
实施细节:
Web 框架:用于现代 Node.js 生产的 Koa
我们使用的内容:
我们选择 Koa 而非 Express 作为 Node.js 生产基础架构,是因为它拥有先进的 async/await 支持和更简洁的中间件组合。我们的创始人 Nick Baugh 曾为 Express 和 Koa 做出过贡献,这让我们对这两个框架的生产应用有了深入的了解。
无论您构建的是 REST API、GraphQL 服务器、Web 应用程序还是微服务,这些模式都适用。
我们的实施方案:
后台作业处理:Bree 实现生产可靠性
我们使用的内容: bree
调度程序
我们创建并维护 Bree 是因为现有的作业调度程序无法满足我们在 Node.js 生产环境中对工作线程支持和现代 JavaScript 特性的需求。这适用于任何需要后台处理、计划任务或工作线程的 Node.js 应用程序。
我们的实施方案:
错误处理:@hapi/boom 实现生产可靠性
我们使用的内容: @hapi/boom
我们在整个 Node.js 生产应用程序中使用 @hapi/boom 来构建结构化的错误响应。此模式适用于任何需要一致错误处理的 Node.js 应用程序。
我们的实施方案:
如何在生产环境中监控 Node.js 应用程序
我们在生产环境中监控 Node.js 应用程序的方法,是经过多年大规模运行应用程序的经验积累而不断演变的。我们实施多层监控,以确保任何类型的 Node.js 应用程序的可靠性和性能。
系统级 Node.js 生产监控
我们的核心实施: helpers/monitor-server.js
我们使用的内容: node-os-utils
我们的生产监控阈值(来自我们的实际生产代码):
- 2GB 堆大小限制 带有自动警报
- 25% 内存使用率 警告阈值
- CPU 使用率 80% 警报阈值
- 75% 磁盘使用率 警告阈值
[!警告] 这些阈值适用于我们特定的硬件配置。在实施 Node.js 生产监控时,请查看我们的 Monitor-server.js 实现,以了解确切的逻辑并根据您的设置调整这些值。
Node.js 生产环境的应用程序级监控
我们的错误分类: helpers/is-code-bug.js
此助手区分:
- 实际代码错误 需要立即关注
- 用户错误 这是预期的行为
- 外部服务故障 我们无法控制
此模式适用于任何 Node.js 应用程序 - Web 应用程序、API、微服务或后台服务。
我们的日志记录实现: helpers/logger.js
我们实施全面的字段编辑来保护敏感信息,同时在我们的 Node.js 生产环境中保持有用的调试功能。
特定应用监控
我们的服务器实现:
队列监控: 我们实施了 5GB 的队列限制和 180 秒的请求处理超时,以防止资源耗尽。这些模式适用于任何具有队列或后台处理的 Node.js 应用程序。
使用 PM2 健康检查进行 Node.js 生产监控
凭借多年的生产经验,我们利用 PM2 完善了 Node.js 生产环境的设置。PM2 健康检查对于维护任何 Node.js 应用程序的可靠性至关重要。
我们的PM2健康检查系统
我们的核心实施: jobs/check-pm2.js
我们通过 PM2 健康检查进行 Node.js 生产监控包括:
- 每 20 分钟一班 通过 cron 调度
- 需要至少 15 分钟的正常运行时间 在考虑流程是否健康之前
- 验证进程状态和内存使用情况
- 自动重启失败的进程
- 防止重启循环 通过智能健康检查
[!CAUTION] For Node.js production deployment best practices, we require 15+ minutes uptime before considering a process healthy to avoid restart loops. This prevents cascading failures when processes are struggling with memory or other issues.
我们的PM2生产配置
我们的生态系统设置: 研究我们的服务器启动文件以进行 Node.js 生产环境设置:
无论您运行的是 Express 应用程序、Koa 服务器、GraphQL API 还是任何其他 Node.js 应用程序,这些模式都适用。
自动 PM2 部署
PM2部署: ansible/playbooks/node.yml
我们通过 Ansible 自动化整个 PM2 设置,以确保所有服务器上的 Node.js 生产部署保持一致。
生产错误处理和分类系统
我们最有价值的 Node.js 生产部署最佳实践之一是适用于任何 Node.js 应用程序的智能错误分类:
我们的 isCodeBug 生产实现
此帮助程序为生产中的 Node.js 应用程序提供智能错误分类,以便:
- 优先处理实际错误 超过用户错误
- 改善我们的事件响应 关注实际问题
- 减少警报疲劳 来自预期的用户错误
- 更好地理解 应用程序与用户生成的问题
此模式适用于任何 Node.js 应用程序 - 无论您是构建电子商务网站、SaaS 平台、API 还是微服务。
与我们的生产记录集成
我们的记录器集成: helpers/logger.js
我们的记录器使用 isCodeBug
确定警报级别和字段编辑,确保我们收到有关实际问题的通知,同时过滤掉 Node.js 生产环境中的噪音。
相关内容
了解有关我们的错误处理模式的更多信息:
使用 v8-profiler-next 和 cpupro 进行高级性能调试
我们使用高级性能分析工具来分析堆快照,并调试生产环境中的 OOM(内存溢出)问题、性能瓶颈以及 Node.js 内存问题。这些工具对于任何遇到内存泄漏或性能问题的 Node.js 应用程序都至关重要。
我们针对 Node.js 生产的分析方法
我们推荐的工具:
v8-profiler-next
- 用于生成堆快照和 CPU 配置文件cpupro
- 用于分析 CPU 配置文件和堆快照
[!TIP] 我们将 v8-profiler-next 和 cpupro 结合使用,为 Node.js 应用程序创建了完整的性能调试工作流程。这种组合有助于我们识别内存泄漏、性能瓶颈,并优化生产代码。
我们如何实现堆快照分析
我们的监控实施: helpers/monitor-server.js
我们的生产监控功能包括在内存超过阈值时自动生成堆快照。这有助于我们在 OOM 问题导致应用程序崩溃之前进行调试。
关键实施模式:
- 自动快照 当堆大小超过 2GB 阈值时
- 基于信号的分析 用于生产中的按需分析
- 保留策略 用于管理快照存储
- 与我们的清理工作整合 用于自动维护
性能调试工作流程
研究我们的实际实现:
Node.js 应用程序的推荐实现
对于堆快照分析:
- 安装 v8-profiler-next 用于快照生成
- 使用 cpupro 用于分析生成的快照
- 实施监控阈值 类似于我们的monitor-server.js
- 设置自动清理 管理快照存储
- 创建信号处理程序 用于生产中的按需分析
对于 CPU 分析:
- 生成 CPU 配置文件 在高负荷期间
- 使用 cpupro 分析 识别瓶颈
- 关注热路径 和优化机会
- 监控前/后 性能改进
[!警告] 生成堆快照和 CPU 配置文件可能会影响性能。我们建议实施限制,并且仅在调查特定问题或维护期间启用配置文件。
与我们的生产监控集成
我们的分析工具与我们更广泛的监控策略相结合:
- 自动触发 基于内存/CPU 阈值
- 警报集成 当检测到性能问题时
- 历史分析 跟踪一段时间内的性能趋势
- 与应用程序指标的相关性 进行全面调试
这种方法帮助我们识别和解决内存泄漏,优化热代码路径,并在 Node.js 生产环境中保持稳定的性能。
Node.js 生产基础设施安全
我们通过 Ansible 自动化为 Node.js 生产基础架构实施全面的安全保护。以下实践适用于任何 Node.js 应用程序:
Node.js 生产的系统级安全性
我们的 Ansible 实现: ansible/playbooks/security.yml
我们针对 Node.js 生产环境采取的主要安全措施:
- 已禁用交换 防止敏感数据被写入磁盘
- 核心转储已禁用 防止包含敏感信息的内存转储
- USB 存储被阻止 防止未经授权的数据访问
- 内核参数调整 兼顾安全性和性能
[!警告] 在实施 Node.js 生产部署最佳实践时,如果应用程序超出可用内存,禁用交换分区可能会导致内存不足导致程序终止。我们会仔细监控内存使用情况,并适当调整服务器大小。
Node.js 应用程序的应用程序安全性
我们的日志字段编辑: helpers/logger.js
我们从日志中删除了敏感字段,包括密码、令牌、API 密钥和个人信息。这不仅保护了用户隐私,还确保在任何 Node.js 生产环境中都能进行调试。
基础设施安全自动化
我们为 Node.js 生产完成的完整的 Ansible 设置:
我们的安全内容
详细了解我们的安全方法:
Node.js 应用程序的数据库架构
我们使用针对 Node.js 应用程序优化的混合数据库方法。这些模式可适用于任何 Node.js 应用程序:
Node.js 生产的 SQLite 实现
我们使用的内容:
我们的配置: ansible/playbooks/sqlite.yml
我们在 Node.js 应用程序中使用 SQLite 来存储用户特定数据,因为它提供:
- 数据隔离 每个用户/租户
- 更好的性能 用于单用户查询
- 简化备份 和移民
- 降低复杂性 与共享数据库相比
此模式适用于 SaaS 应用程序、多租户系统或任何需要数据隔离的 Node.js 应用程序。
Node.js 生产的 MongoDB 实现
我们使用的内容:
我们的设置实现: helpers/setup-mongoose.js
我们的配置: config/mongoose.js
我们在 Node.js 生产环境中使用 MongoDB 来存储应用程序数据,因为它提供:
- 灵活的模式 用于不断发展的数据结构
- 更好的性能 对于复杂查询
- 水平扩展 能力
- 丰富的查询语言
[!NOTE] 我们的混合方法针对特定用例进行了优化。请研究我们代码库中实际的数据库使用模式,以了解此方法是否适合您的 Node.js 应用程序需求。
Node.js 生产后台作业处理
我们围绕 Bree 构建了后台作业架构,以实现可靠的 Node.js 生产部署。这适用于任何需要后台处理的 Node.js 应用程序:
我们的 Bree 服务器生产设置
我们的主要实现: bree.js
我们的 Ansible 部署: ansible/playbooks/bree.yml
生产作业示例
健康监测: jobs/check-pm2.js
清理自动化: jobs/cleanup-tmp.js
我们所有的工作: 浏览我们的完整职位目录
这些模式适用于需要以下功能的任何 Node.js 应用程序:
- 计划任务(数据处理、报告、清理)
- 后台处理(图像大小调整、电子邮件发送、数据导入)
- 健康监测和维护
- CPU 密集型任务的工作线程利用率
Node.js 生产环境的作业调度模式
研究我们的作业目录中的实际作业调度模式,以了解:
- 我们如何在 Node.js 生产中实现类似 cron 的调度
- 我们的错误处理和重试逻辑
- 我们如何使用工作线程来执行 CPU 密集型任务
生产 Node.js 应用程序的自动维护
我们实施主动维护,以防止常见的 Node.js 生产问题。以下模式适用于任何 Node.js 应用程序:
我们的清理实施
我们对 Node.js 生产应用程序的自动化维护目标是:
- 临时文件 超过 24 小时
- 日志文件 超出保留限制
- 缓存文件 和临时数据
- 已上传的文件 不再需要
- 堆快照 从性能调试
这些模式适用于生成临时文件、日志或缓存数据的任何 Node.js 应用程序。
Node.js 生产的磁盘空间管理
我们的监控阈值: helpers/monitor-server.js
- 队列限制 用于后台处理
- 75% 磁盘使用率 警告阈值
- 自动清理 当超过阈值时
基础设施维护自动化
我们针对 Node.js 生产的 Ansible 自动化:
Node.js 生产部署实施指南
研究我们的实际代码以获得生产最佳实践
从以下关键文件开始设置 Node.js 生产环境:
- 配置:
config/index.js
- 监控:
helpers/monitor-server.js
- 错误处理:
helpers/is-code-bug.js
- 记录:
helpers/logger.js
- 进程健康:
jobs/check-pm2.js
从我们的博客文章中学习
我们的 Node.js 生产技术实施指南:
Node.js 生产的基础设施自动化
我们的 Ansible 剧本可用于研究 Node.js 生产部署:
我们的案例研究
我们的企业实施:
结论:Node.js 生产部署最佳实践
我们的 Node.js 生产基础设施证明 Node.js 应用程序可以通过以下方式实现企业级可靠性:
- 经过验证的硬件选择 (针对AMD Ryzen单核性能优化573%)
- 经过实践检验的 Node.js 生产监控 具有特定阈值和自动响应
- 智能错误分类 改善生产环境中的事件响应
- 高级性能调试 使用 v8-profiler-next 和 cpupro 来预防 OOM
- 全面安全加固 通过 Ansible 自动化
- 混合数据库架构 针对应用需求进行了优化
- 自动化维护 防止常见的 Node.js 生产问题
重点: 学习我们实际的实现文件和博客文章,而不是遵循通用的最佳实践。我们的代码库提供了 Node.js 生产部署的实际模式,可适用于任何 Node.js 应用程序 - Web 应用、API、微服务或后台服务。