Node.js 构建后端和前端解决方案(nodeJS)

Node.js 构建后端和前端解决方案(nodeJS),node.js,reactjs,architecture,Node.js,Reactjs,Architecture,我有一个后端运行node/express,提供API端点和两个静态(react)前端。前端与用户交互,并与后端通信 一旦进入生产阶段,我需要使用https。 前端需要自己的域名 我一直在考虑最简单的配置方法,并提出了选项1(见图)。Node.js API服务器运行在一个VPS上,由于前端是静态站点,因此可以将其加载到单独的服务器上(更新-意思不是说托管提供商),从而获得自己的域。作为一种选择,我不确定是否需要,将cloudflare添加到前端以提供一层安全性。 这将允许前端有单独的域名 由于这是

我有一个后端运行node/express,提供API端点和两个静态(react)前端。前端与用户交互,并与后端通信

一旦进入生产阶段,我需要使用https。 前端需要自己的域名

我一直在考虑最简单的配置方法,并提出了选项1(见图)。Node.js API服务器运行在一个VPS上,由于前端是静态站点,因此可以将其加载到单独的服务器上(更新-意思不是说托管提供商),从而获得自己的域。作为一种选择,我不确定是否需要,将cloudflare添加到前端以提供一层安全性。 这将允许前端有单独的域名

由于这是一个启动项目,并且怀疑有大量的访客,我想知道上述内容是否设计过度且不一定复杂

因此,我正在考虑在同一个linux vps上托管后端api应用程序和两个前端的选项2。由于前端是静态的,我将前端添加到node.js的公共文件夹中。这使我能够访问前端作为http://serverIP:8080/siteA
因为我想访问前端,因为我假设我需要一个反向代理(nginX) 帮助我在这两个选项之间做出决定的问题有:

  • 对于启动操作,考虑到上述情况,哪种方案最好
  • 我知道node.js需要一个端口号才能正常工作,对于API,我不介意有一个端口号(因为它不适用于最终用户,即),但是两个前端需要自己的域名(,),因此,无论它们是否是静态站点,我都需要使用反向代理(nginX)
  • 我担心有人会攻击API端点()。在这种情况下,选项2是否真的比选项1更安全?我可能会阻止恶意的直接API调用,因为所有站点都托管在同一VPS上,并且API很容易得到保护,这不会暴露于外部世界
  • 我的开发人员曾经告诉我,选项1是最好的,因为nginX增加了不必要的复杂性,但不确定他的意思——因此我感到困惑,老实说,我认为他不想将nginX添加到服务器
  • 我正在寻找一个高层指导,让我走上正确的轨道。谢谢


    正如您所怀疑的,这是不必要的复杂,在某些情况下是不正确的。这里有一个更好的(在整个行业中广泛使用的)设计。我强烈建议您放弃整个虚拟机方法,转而使用共享计算单元,除非您将该计算机用于其他计算,并且以这种方式使用它可以为您的公司节省大量资金。我强烈怀疑这种情况。否则,你只会给自己制造麻烦

  • 在使用Node.js时,您可能会犯的最常见错误之一是通过公用文件夹托管静态内容(对于严肃的项目)而不是。改用CDN。根据CDN、冗余、更快的交付等,您将获得更好的遥测。如果您不期望高流量,并且交付静态内容的性能目前并不十分重要,那么您甚至可以选择常规托管服务器。我以前和namecheap和GoDaddy一起做过

  • 为您的应用程序使用直接节点js共享或专用(取决于大小),并使用CI/CD进行部署。您可以使用映射您希望应用程序所在的任何域名(例如:),以映射到您应用程序的云托管提供商url的域名。我使用了多种东西,Azure、Heroku、Name便宜的应用程序,主要是Azure DevOps来管理CI/CD管道,尽管Jenkins也非常受欢迎

  • 在HTTP上设计任何API时,您应该假设人们将直接调用您的API。请参阅此答案了解更多详细信息:我不是建议使用CloudFlare之类的工具,但您可能想得太多了,请首先查看您的流量。你需要的时候就去拿。只要您有适当的身份验证/授权机制,API的安全性在这些平台上就不会是大问题。如果您将其部署在其中一个平台上,您也不必处理端口。除非你达到绝对大规模的规模,否则你用这种方式进行高可靠性操作肯定会更便宜

  • 您将不再需要处理nginx


  • 您好,谢谢-我更新了我的问题,因为我犯了一个错误,意思是说作为选项a前端可以上传到主机提供商。我认为这与你的答案一致?我不理解您对CDN的评论,因为CDN不提供托管?关于后端node.js托管,我使用的是MERN stack,使用的是vps,即linux droplet——我已经配置好了——同意这是一个痛苦的学习曲线;您是否建议,在我的场景中,根据您的第2点(Azure、Heroku、Name便宜…),我可以使用共享服务对所有的问题感到抱歉是的-对于静态内容(js、css、纯html文件、图像等),您应该使用CDN。我建议放弃linux droplet并从heroku这样的地方配置一个共享单元,您将在20分钟内完成所需的设置。@Jet如果这能解决您的问题,我将不胜感激。我从未深入研究过“共享单元”,请原谅我的无知。我假设这是指Dyno、Elastic Beanstalk和Azure Web应用程序。以前,我将文件FTP到服务器,然后如果需要,可以使用FTP检查各个远程文件。上述产品是否仍能实现这一点?我还需要使用Mongo和websocket,这些平台允许吗?在冒险之前,试着比较和理解VPS和“共享单元”。这些平台允许web套接字/你有一个Mongo扩展