JavaScript 堆栈 - Web 服务器和 API 服务器:一起还是分开?

JavaScript Stack - Web Server and API Server: together or separate?

我们正在开发一个基于 javascript 框架和库(节点、express/sails、angular、mongo 等)的大型网络应用程序。

我们需要一个后端,一方面为 Web 应用程序提供服务,另一方面接受 API 数据调用(来自同一个应用程序,但也来自其他来源)- 这些天很常见。

我们要做出的决定之一是,我们应该将 Web 应用程序服务器和 API 服务器的后端分开还是放在一起。

例如,我们应该有一个 express 运行 为两者提供服务,还是应该为 web 应用程序、静态内容、auth 等提供快速服务,并有一个单独的 Restify 服务器为数据提供服务。

每个议程的优缺点是什么?

关注点的干净分离总是可行的方法。如果,如您所说,您的 API-Server 也接受来自其他应用程序的调用,我建议您将静态文件的传送与您的 API 分开。它让您更灵活地改变一个或另一个的工作方式。另一个好处是您的 API 只需要担心 API 来电而不是送货,这应该会更快地接听电话。

我要更进一步说:使用 nginx 交付您的静态 Web 应用程序文件(如果您不使用服务器端模板)。另请参阅 this Thread - nginx 在交付静态源时速度更快。

在我的公司,我们对每个应用程序都是这样做的,结果证明效果很好。

所以优点:

  • 更好的性能 - 静态交付和 API
  • 清晰的关注点分离
  • 更灵活地改变其中之一

唯一con是需要安装和维护两个程序。但考虑到 NodeJS 非常容易设置,这不应该成为阻碍。

编辑 正如 mnemosyn 在评论中所说,如果你分离你的应用程序,你仍然应该通过 nginx 服务器拉取每个请求以避免一些同源策略问题。在你的 nginx 中,你只需配置一个指向你的 NodeJS-App 的虚拟主机,然后将所有请求代理到指定路径(例如 /api/)到该 VHost。你可以阅读它 here.