将 ReactJs 前端 + NodeJs 后端部署到 AWS

Deploying ReactJs frontend + NodeJs backend to AWS

我有一个 NodeJs/React 网络应用程序。我用来部署到一个 EC2 实例。这是正确的做法吗?

我在网上看到一种选择是使用 CloudFront 将前端放在 S3 中,然后将后端放在 EC2 实例中。在这种情况下,NodeJs 服务器是否提供该存储桶中的静态文件?或者它是如何工作的?

存储桶的工作方式类似于静态网络托管。

由于 React 是客户端渲染,而不是服务器渲染,因此它是一个与您的节点后端完全不同的应用程序。

客户端将从 CloudFront/S3 接收静态文件,并且这些文件(HTML、JavaScript 在客户端机器上呈现)将与您的 API 通信托管在 EC2 中。

您可以在 EC2 中托管前端和后端。

或 S3 或 CludFront 中的前端和 EC2 中的后端。

如果您单独托管您的东西会更便宜,因为 EC2 具有动态成本。

现在,如果你使用像NextJS或Gatsby这样的服务器渲染框架,“静态文件”和后端是一回事,后端渲染静态文件并将它们发送给客户端,在这种情况下你需要在 EC2 中托管所有内容。

出于实用性考虑,通常最好将所有内容都托管在同一台服务器上,尤其是在没有动态成本的情况下。

您可以为您的服务器选择另一个 VPS 托管,这与您的问题无关,但我推荐 Hetzner,它比 EC2 更便宜也更好。

在 Compute 上托管 React 应用程序的动态部分(我更喜欢 ECS+Fargate 而不是 EC2)并在 S3 + CloudFront 上托管静态部分是使用 AWS 托管服务功能的有效方式。您的架构将是这样的:

client -> CloudFront (cached) -> S3 (static resources)
client -> CloudFront (NOT cached) -> LB -> Compute (EC2 / Fargate / Lambda)

您可以通过 CloudFront 行为功能管理不同的路径或路线。所以 root (/index.html) 指向你的 S3。和 API (/api) 可以指向动态内容的负载均衡器。