我可以在同一台服务器上部署多个前端应用程序 (web/mobile) 和 1 个后端吗?

Can I deploy multiple front-end apps (web/mobile) with 1 back-end on the same server?

我需要一些帮助来决定我的项目的架构(一个用于解锁折扣的网络应用程序)。我首先计划创建网站(React 用于前端,Django 用于后端,PostgreSQL 数据库)。将来,我也可能会为 Android & iOS 创建一个移动应用程序(还不确定是什么前端框架)。

所以我决定我希望前端和后端完全分离,所以后端是 REST api。这将使我不必为移动应用程序创建多个后端。

但是,经过研究,我发现这在服务器成本方面可能相当昂贵。这是一项新业务,我是唯一的开发人员,因此资金不多。所以我在想我可以将前端和后端部署在同一台服务器上,但作为单独的应用程序通过 nginx 进行通信?

我有 4 个问题:

  1. 如果我这样做,是否仍然可以将后端作为移动应用程序的 REST api 重用,还是不行,因为它链接到 Web 前端?
  2. 如果可能的话,我是否可以在同一台服务器上托管移动前端(所以所有内容都托管在一台服务器上)?
  3. 这是一个愚蠢的想法吗 - 我是否最好将所有内容部署到长期的单独服务器中 - 运行(以减少负载)?
  4. 以后我只需要担心这个吗?现在只需将分离的 Web 前端和后端部署到同一台服务器。

我从来没有真正将任何东西部署到现实生活中的生产环境中,所以如果我的问题看起来很愚蠢,我很抱歉。我还没有开始开发,但我想在开始之前考虑可伸缩性和未来的可扩展性。谢谢。

现在我会采用无服务器方法。无需维护服务器,您可以专注于您的应用程序功能。

有很多选择。例如,您可以查看 AWS Amplify (https://aws.amazon.com/amplify/) or Netlify (https://www.netlify.com/) 以获得更“全栈”的方法。

在 AWS 中,您还可以保留单独的项目,让您的后端在 lambda 中,而您的前端通过 S3 + CloudFront 提供服务。您也不必关心服务器。

只有一些示例可以说明如何在没有服务器的情况下解决您的问题,但可以回答您的问题:

  1. 无论应用的部署方式如何,您都可以重复使用 API。这将与您如何设计它们更相关;
  2. 是的,如果你愿意,你可以在一台服务器上托管所有东西,但我真的不推荐这样做;
  3. 如果您不想为 24/7 服务器付费,可以选择无服务器方法;
  4. 正如我之前告诉你的,你可以做你想做的事而不用担心服务器。

您的主要关注点是保持较低的成本并实施良好的解决方案。我的建议是寻找 AWS Lightsail。 Lightsail 提供您可以自行配置的固定价格 VM,在撰写此答案时起价为 3.5 美元/月

我对你问题的回答

  1. 如果我这样做,是否仍然可以将后端作为移动应用程序的 REST api 重用,或者是否可以,因为它链接到 Web 前端-结束?

    • 是的,这是可能的。将前端和后端保持在不同的 repo 中,您可以将其作为 docker 个实例部署在同一台服务器上。您将拥有 1 个前端 docker 容器和 1 个后端 docker 容器,它们可以相互通信。
  2. 如果可能的话,我是否可以在同一台服务器上托管移动前端(所以所有内容都托管在一台服务器上)?

    • 对于移动设备,您将开发一个可以发布到 Playstore 或部署到智能手机的移动应用程序。然后,您的应用可以调用后端服务并获得 JSON 作为响应。所以你必须以这样一种方式设计你的后端,它可以为两个请求提供数据。
  3. 这是一个愚蠢的想法吗 - 我是否最好将所有内容部署到长期的单独服务器中 - 运行(以减少负载)?

    • 从长远和设计的角度来看,您需要考虑可扩展性、可维护性、安全性等因素,因此最好使用多个服务器来避免 single point of failure
  4. 我以后是不是只担心这个?现在只需将分离的 Web 前端和后端部署到同一台服务器。

    • 我给你的建议是现在仔细想想,这样你以后就不会做噩梦了。现在投入您的时间并设计一个稳定的解决方案,该解决方案可以长期为您提供帮助。正如您提到的,它是一家小型企业,但您的解决方案应该能够轻松应对增长。

我的建议

  • 正如 Paulo 所建议的,S3 + CloudFront 看起来很适合前端。您可以使用 Lightsail 获得 1 年免费 CDN

  • 对于后端,您应该至少有 2 个(我建议最少 3 个)服务器并部署后端 docker 个容器。您可以使用 docker compose 来自动化部署。如果你想编排那么 Docker Swarm Mode 是最好的。有了这个,您将避免单点故障。您可以从 Amazon Lightsail

    获得非常实惠的服务器
  • 对于数据库,您需要使其具有可扩展性。为了确保可伸缩性和高可用性,我们应该有复制的数据库。最少 3 个数据库实例将是一个很好的起点。 MongoDB 是个不错的选择。通过简单的配置,您可以启用数据库复制。 1 Master 2 slaves 实例。

  • 1 服务器前面的负载均衡器用于分配负载。为了节省成本,您可以自己配置负载均衡器,但这会增加学习曲线,您将不得不花时间和了解细节。更好的解决方案是使用托管负载均衡器。 Lightsail 在撰写此答案时以 18 美元/月 的价格提供负载均衡器。

上述解决方案具有成本效益,将为您带来长期利益,您也可以根据您的解决方案估算成本。
显然,这仍然可以改进,但我试图涵盖所问问题的必要方面。