强大的 NodeJS 部署架构

2025-05-25

强大的 NodeJS 部署架构

这篇文章旨在简洁地描述一个高效且健壮的 NodeJS Web 应用自托管架构。我将从相对较高的层次描述相关技术和组件,读完之后,您将对这样的系统有一个大致的了解。本文将重点介绍经过良好测试的标准组件,而不是最新的云/容器化产品。它非常适合运行中小型应用程序。

Node.js Web 开发技术

架构特点

  • 在标准 VPS 主机上运行
  • 扩展的可能性
  • 安全的
  • 易于维护
  • 容错
  • 低成本
  • 备份并易于恢复
  • 轻松的机器配置
  • 易于部署代码
  • 支持多种数据库

3个主要组件

  • 负载均衡器
  • Web 和 API 应用服务器
  • 数据存储

在其生命周期中,客户端 Web 请求会通过互联网传输,最终到达负载均衡器,所有 SSL/TLS 连接都会在此终止,然后使用自签名证书重新加密,并发送到可用的应用服务器。该应用服务器执行其所需的任务,并将信息持久保存在共享数据存储中。响应直接从应用服务器发送到客户端。

SSL/TLS 终止发生在负载均衡器上,因为它使证书管理变得更加容易,只有一个地方可以更新、创建、更新和备份证书。

拥有负载均衡器可确保您可以并行运行多个应用程序服务器,这意味着您只需添加更多应用程序服务器即可进行扩展,但这也意味着您可以重新启动服务器而不会影响站点正常运行时间。

至于应用服务器,您可以将 Web 服务器与 API 服务器分离,但为了便于维护,您也可以在同一台机器上使用不同的端口运行它们,并在机器上使用反向代理将请求定向到正确的应用程序。这样,您就拥有了一个独立的单元,这使得扩容变得更加容易。在绝大多数情况下,这种设置已经足够好,但以后可以进行优化。

拥有共享数据存储是并行运行应用服务器的关键。共享数据存储是指一台挂载了大容量存储卷的单机。它运行所有将数据写入该存储卷的数据库。为了实现高可用性,该数据存储也可以在一组集群机器上运行,但这会增加不少复杂性。因此,最初最好只运行一台具有良好备份的机器,这样即使出现任何问题,也能以最短的停机时间恢复运行。

技术

  • Nginx - 负载均衡器和反向代理
  • Redis - 键/值非常快的数据库,通常用于存储会话和缓存
  • Mongodb ——NoSQL 数据库
  • Postgres - SQL 数据库
  • Letsencrypt certbot - 用于生成和维护证书
  • Linux Ubuntu - 适用于所有 3 个组件的操作系统
  • Pm2 - NodeJS 进程管理器,运行应用程序、处理日志记录和各种其他运行时活动
  • RabbitMQ - 对于容错后端系统非常重要的消息队列软件
  • Mongodb-queue - 通过 MongoDB 支持的 NodeJS 库实现的消息队列

配置基础设施

在这方面,你可以让事情变得非常简单,为三个主要组件分别使用一个Bash脚本。该脚本需要执行以下操作:

  • 安装最新的操作系统更新
  • 安装必要的软件
  • 配置用户和组
  • 写入/更新软件配置文件
  • 启动和停止各种服务

以下是您需要了解的一些重要的 Linux 项目:

  • sshd——用于 ssh 连接的服务器
  • stunnel - 创建安全连接,用于没有内置 SSL 的应用程序的数据存储 - 例如 Redis
  • ufw / iptables - 防火墙
  • PKI和创建自签名证书
  • logrotate——管理应用程序日志文件的轮换和备份
  • cron - 安排运行维护脚本,例如备份
  • certbot——生成和更新证书
  • rsync——在机器之间安全地同步文件

您的VPS托管服务提供商可能提供 API 和/或命令行工具,让您可以创建一个配置脚本,用于创建 VPS 服务器,并通过 rsync 将 bash 安装脚本同步到服务器并运行。因此,您只需运行脚本即可轻松配置新的服务器,并且完全可重复。

值得注意的是,有一些使用Kubernetes等容器化的现代工具,它们非常强大,但也可能变得相当复杂。

部署代码

这是简单的 bash 脚本可以发挥很大作用的另一个地方。

它需要做以下事情:

  • 将应用程序构建到部署目录
  • 备份当前正在运行的应用程序
  • 将文件 Rsync 到应用服务器
  • 重新启动应用服务器

这个领域有很多变化。许多使用CI/CD 系统的现代工作流程使用 git 将整个应用程序
存储库克隆到服务器,而不是仅 rsync 构建的文件。不同项目的需求差异很大。

Bash 脚本路由非常简洁,但通常需要更多手动步骤,尤其是在应用程序配置复杂的情况下。在项目早期,这通常就足够了。

备份

备份非常重要。您需要备份所有重要文件,最好还要编写脚本,以便在组件发生故障需要恢复时恢复备份。

考虑备份:

  • 每个部署的应用程序版本,以及配置
  • 数据库、防火墙的日志文件
  • 证书
  • 所有数据库的内容
  • 您正在使用的每个第三方应用程序的配置

使用大型云提供商的存储是一个好主意,它们成本低并且具有良好的脚本工具。

安全

安全配置您的设备并适当设置防火墙(本地和云端)非常重要。始终使用 TLS/SSL 进行设备间通信。遵循您安装的各个软件的安全建议,例如为特定用途创建不同的用户(例如应用程序访问权限和备份访问权限)。仅授予执行特定任务所需的最低访问权限。

暂存和生产环境

一旦应用程序在生产环境中运行,拥有一个临时环境将使您受益匪浅。它是生产环境的复制品,您可以在其中尝试新代码,而不必担心破坏实时系统。切勿直接部署到生产环境,务必先在临时环境中进行测试。

总结

运行应用程序的基础设施方面可能变得相当复杂,但了解如何自己构建这些设置有很多好处:

  • 将成本保持在最低水平
  • 完全控制基础设施
  • 能够部署在任何地方

对于负载非常高的方面,集成无服务器技术也是值得尝试的,低成本和高性能可能值得牺牲可移植性,但请注意,如果需要更换提供商,此举可能需要重写部分应用程序。

--

感谢阅读!

@markjgsmith

我目前可供雇用- 请考虑雇用我!

如果您喜欢这篇文章,您可能会喜欢将我的博客提要添加到您的 RSS 阅读器、阅读我的每日链接博客或订阅我的每周新闻通讯。:)

最初发布于blog.markjgsmith.com

文章来源:https://dev.to/mjgs/robust-nodejs-deployment-architecture-5go6
PREV
规划真实世界的 Web 应用程序和关键考虑因素(第一部分:项目管理)
NEXT
なぜ dev.to がこんなにも速く、こんなにも自分にとって感动的なのか