node.js - Next.js + API 在同一台服务器上
问题描述
看看下面的场景,我想知道这在架构方面是否可以被认为是一个好的实践:
- 一个使用 NextJS 框架在服务器上呈现的 React 应用程序。由于应用程序的数据经常变化,它使用服务器端渲染(“SSR”或“动态渲染”)。就代码而言,它获取
getServerSideProps()
函数上的数据。这意味着它将由服务器在每个请求上执行。 - 在同一个服务器实例中,有一个 API 应用程序并行运行(它可以是 NodeJS API、Python Flask 应用程序……)。这个应用程序负责查询数据库、准备模型并对数据应用任何转换。可以从外部访问 API。
我的问题是:NextJS 如何在内部与 API 应用程序通信?它通过本地主机端口发送请求是正确的方法吗?如果没有,是否有替代方案不暗示 NextJS 将外部 HTTP 请求发送回同一服务器本身?
关键要求之一是每个应用程序必须保持独立。它们目前在同一台服务器上运行,但它们来自不同的代码存储库,并且每个都有自己的 SDLC 和发布过程。它们有自己的域 (URL),将来它们可能存在于不同的服务器实例上。
我知道在 NextJS 中,您可以使用诸如Prisma之类的库来查询数据库。但这不是一个选择。数据建模由 API 管理,我希望避免重复工作。此外,一旦 NextJS 在客户端呈现,React 将继续通过正常的 HTTP 请求调用 API 应用程序。这是为了保持动态的前端体验。
解决方案
当前端应用程序独立于后端运行时,这是非常常见的场景。反向代理通常会帮助我们。
这是我想建议您用来实现的简单方法(这也是最好的方法之一)
- 为您的前端和后端应用程序使用不同的端口
- 所有 api 都应该以特定的 url 开头,
/api
并且您的前端路由不能以/api
- 使用网络服务器(我主要使用Nginx来帮助我处理虚拟主机、反向代理、负载平衡以及服务器静态内容)
因此,在您的 Nginx 配置文件中,添加/更新以下位置/路线
## for backend or api and assuming backend is running on 3000 port on same server
location /api {
proxy_pass http://localhost:3000;
## Following lines required if you are using WebSocket,
## I usually add even not using WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
## for frontend and assuming frontend is running on 5000 port on same server
location / {
proxy_pass http://localhost:5000;
}
推荐阅读
- python - python:将项目添加到列表时形状不匹配
- perforce - Perforce:如何从仓库版本中查找已修改的文件列表
- firebase - 使用自定义域名作为 firebase 数据库/身份验证/存储 URL
- android - 长时间运行的任务被安卓操作系统杀死
- javascript - padStart 不是函数
- c# - 在 C# 中动态加载 c dll
- java - 自定义Adapter:在getView方法中,当convertView作为View变量接收时,人为什么要重新赋值给另一个View对象
- azure - 导入停止 Azure V2 VM 运行手册
- floating-point - 为什么浮点数的指数部分这么复杂?
- android - 如何在 Android 的 Chrome 中读取纯原始麦克风数据?