【问题标题】:Deploying two Express servers in one application在一个应用程序中部署两台 Express 服务器
【发布时间】:2019-12-24 21:27:24
【问题描述】:

我在单个 Node.JS 应用程序中打开了两个快速服务器。

用例是打开 2 个单独的套接字来同时运行 2 个服务。

问题是 Google Cloud 或 Heroku 不提供对多个端口的访问 -> 没有单独的端口 = 没有单独的套接字。

有没有一种方法可以在任何云服务(如 Google Cloud/AWS/Heroku)中的单个部署中打开 2 个服务器端口(以获得两个单独的套接字)?

或者还有其他解决方法吗?

【问题讨论】:

  • AFAIK 你可以使用 NGINX 或一些反向代理来做到这一点。你甚至可以查看http-proxy-middleware节点模块
  • 您需要指定您正在使用的 Google Cloud 服务。例如,Compute Engine 与 App Engine 非常不同。

标签: node.js express heroku google-cloud-platform serversocket


【解决方案1】:

这是可能的。在典型的 MERN 堆栈中,我使用concurrently 在不同的端口和相同的部署中并行运行我的React.js 应用程序和Express.js 应用程序。在这种情况下可以使用类似的设置。

以下示例已使用 Google Cloud Platform 的 App Engine (Flexible environment) 进行测试

假设你有一个这样的项目结构:

~/project
|- Dockerfile
|- app.yaml
| 
|- service1
|| - index.js
|| - package.json
|| ...
|
|- service2
|| - index.js
|| - package.json
|| ...

假设您的 express 应用程序是使用 express-generator 创建的,那么事实上,在创建时,两个应用程序都在同一端口上运行,如 ./service1/bin/www./service2/bin/www 中的此特定行所示:var port = normalizePort(process.env.PORT || '3000'); .相反,您可以让 service1 的 bin/www 保持不变,以便它继续侦听 process.env.PORT,在这种情况下为 8080,并改为编辑 ./service2/bin/www,使其在您喜欢的任何特定端口上运行,而不是 8080 或 3000,例如,假设您希望在端口 3005 上运行它。

接下来,您必须编辑 service1 的 package.json 以便在 npm start 上同时在各自的端口上运行这两个应用程序。可以这样做:

"scripts": {
    "start": "concurrently \"node ./bin/www\" \"node ../service2/bin/www\""
  }

不幸的是,默认情况下不会打包并发,因此此命令可能会产生无法识别的错误。因此,您可以使用 Dockerfile,其目的是指定运行时映像以及部署的构建步骤(npm 安装两个应用程序,npm install -g concurrently 后跟 npm start

FROM gcr.io/google_appengine/nodejs
COPY . /app/
RUN cd ./service1 && npm install
RUN cd ./service2 && npm install
RUN npm install -g concurrently
CMD cd ./service1 && npm start 

最后,提供一个app.yaml 文件,该文件将指定使用的运行时以及环境。

runtime: custom
env: flex

【讨论】:

  • 在您的情况下,只有 service1 可以从外部访问。服务 2 仅在本地工作,只能由服务 1 访问。我说的对吗?
  • @guillaumeblaquiere 你说得对,纪尧姆。在制定这个答案时我没有考虑到这一点,因为这种方法主要用于部署 React + Express 应用程序而不是 Express 2x 应用程序。使用这种方法,每个请求都必须通过 service1,因此访问 service2 仍然需要来自 service1 的某种路由,这将破坏让 2 个快速服务并行运行的整个目的。尽管如此,我认为它应该给 OP 一些想法,他可以根据这些想法创建一个适合他的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多