【发布时间】:2017-05-06 03:04:12
【问题描述】:
我有一个 React + Webpack/Babel + Node/Express 应用程序,我想将它部署在 AWS 上。
我需要分别部署 React 和 Node/Express 吗?或者它们可以同时部署在一起吗?
【问题讨论】:
标签: javascript node.js amazon-web-services reactjs deployment
我有一个 React + Webpack/Babel + Node/Express 应用程序,我想将它部署在 AWS 上。
我需要分别部署 React 和 Node/Express 吗?或者它们可以同时部署在一起吗?
【问题讨论】:
标签: javascript node.js amazon-web-services reactjs deployment
例如一个 React single-page app 和一个 Node/Express API。
S3 和 CloudFront (tutorial) 上的 前端(React 应用程序)
Elastic Beanstalk(推荐)或EC2上的后端(Node API)
另一种选择是在Elastic Beanstalk 或EC2 上同时部署这两个部分。但是,您将错过在 S3 和 CloudFront 上托管的好处,即为您的用户提供更快的交付和更便宜的成本。在我看来,单独更新和部署 Web 应用程序的客户端和服务器端也更方便,更不容易出现意外错误。
单独部署的另一个好处:对于拥有不同前端和后端团队的组织,每个团队都可以更轻松地自行部署应用程序,而无需依赖另一个团队团队。
4xx 错误的重定向(如果您的应用使用基于 HTML5 History 的路由器,则必须这样做)http2 和 http to https 重定向您可以使用不同的子域,例如
api.domain.com 用于 Node/Express APIapp.domain.com React 应用程序然后在 API 中enable CORS:
app.get('/api', cors({ origin: 'https://app.domain.com' }), ...)
例如一个包含一些 React 视图的 Node 应用程序。
您必须在Elastic Beanstalk 或EC2 上部署整个应用程序。
注意:如果您有一个项目包括两个子项目(即一个文件夹用于 React 应用程序,另一个文件夹用于 Node API),并且如果两个子项目在它们分开时仍然可以工作,那么您可以部署子项目分开(见答案的第一部分)。
在部署 React 部分之前运行您的Webpack build。您可以手动(在 AWS 上部署之前)或自动(在您的 CI/CD 系统中)执行此操作。如果您使用 create-react-app (CRA) 引导您的应用,只需在项目的根目录下运行 yarn build 或 npm run build 并将“build”文件夹的内容上传到您的 S3 存储桶。
aws s3 命令管理 S3 存储桶和对象。eb 命令管理和部署您的后端。我回答 a related question 不限于 AWS。
【讨论】:
api.domain.com 用于 nodejs 应用程序,*.domain.com 用于 s3 存储桶)和enable CORS 在 nodejs 应用程序中用于这些子域:@987654356 @
要轻松部署应用,您需要了解三个概念:微服务、容器和流程管理器。我将用更多的细节和几个链接来讨论它们以帮助您入门:
微服务是一种架构,可让您将应用划分为更小的服务。这有很多好处: 1-服务易于测试。 2-服务是可更换的。 3- 服务可以单独扩展。
几乎每个有用的应用程序都至少有几十个依赖项。您可以在目标机器上安装依赖项,但您肯定会面临一些挑战。像 Docker 这样的程序允许您为您的应用程序创建一个容器并将该容器部署在云上。 (不考虑云提供商)Learn more...
流程管理器可确保您的应用运行顺畅且所有部分都运行良好。如果您的应用崩溃,它可以轻松重启应用。
注意: 如果您使用 ReactJS 进行服务器渲染,则此方法不起作用。转到下一个选项。
您可以简单地构建您的应用并将其部署到静态 S3 网站。如果您使用微服务架构将 API 与 React 应用分开,则此选项有效。
在 S3 中创建静态网站非常简单:
如需更多信息,请查看 AWS 方便documentation。
您可以为每个微服务启动不同的 EC2 实例。 (API、React 应用等)您需要使用PM2 等流程管理器来确保您的应用顺利运行。
要创建自动部署,我更喜欢将Terraform 与Ansible 结合使用。 Terraform 非常具有声明性。您描述了云基础架构的外观,然后 Terraform 为您构建它。
另一方面,Ansible 是非常程序化的,非常适合配置新服务器。
理想情况下,您应该进行单元测试,以防止将错误代码发送到生产环境。 (使用Jest 和supertest,Enzyme 进行浅层渲染)。但是这个世界是不完美的,接收客户端上发生的任何潜在错误是件好事。输入Sentry
【讨论】: