【问题标题】:Recommended approach for multiport app using Heroku使用 Heroku 的多端口应用程序的推荐方法
【发布时间】:2017-06-01 02:22:24
【问题描述】:

据我从有关 SE 的其他问题中了解到,在 Heroku 应用程序中无法使用多个端口,因为 Heroku 会为端口分配一个环境变量。

有没有推荐的解决方法?我见过一些使用带有子域的代理模块:

Heroku + node.js: I have a server which uses multiple ports. How can I get Heroku to allocate them?

但是,在这篇文章中:

How to create a subsubdomain for an app on heroku: (e.g. sub.myapp.herokuapp.com)

这表示 Heroku 中不再有子域。

在我的应用程序中,我目前正在使用 express 提供我的内容,并且有一个 websocket 服务器用于同步一些实时内容,两者都需要一个端口。我的问题是,在 heroku 中是否可以使用子域,以及为需要多个端口的 Web 应用程序提供服务的推荐方式是什么?

【问题讨论】:

    标签: node.js heroku port reverse-proxy


    【解决方案1】:

    我最终发现您实际上可以为 websocket 和 http 使用相同的端口。以 socket.io 为例,你只需要执行以下操作...

    var SocketIO = require('socket.io');
    var express = require('express');
    
    var app = express();
    
    // Put your middleware and routes here...
    
    const server = app.listen(port, function(err){
          console.log("Express server running on port:" + port);
    });
    
    var io = SocketIO(server);
    

    由于做app.listen时的返回值是服务器,其实你可以直接把这个权限传给socketIO。从那里你可以做 io.on(...) 等。

    【讨论】:

      【解决方案2】:

      所以,回答你的问题:

      您不能在单个 Heroku dyno 上的多个端口上运行单个应用程序。

      但是,您可以运行多个 Heroku dyno,并且每个运行不同的命令。这允许您在同一项目中的 Heroku 上运行不同“类型”的服务器。这样做的方法是在 Procfile 中指定如何运行不同类型的服务器,例如:

      web: node server.js
      other-web: node other-server.js
      

      要运行server.js 的一个实例和other-server.js 的一个实例,您可以简单地告诉 Heroku 将这些进程作为 dynos 运行,如下所示:

      $ heroku ps:scale web=1 other-web=1
      

      现在——关于 websockets,Heroku 本身就支持它们,就像几年前一样(你可以在这里阅读更多信息:https://devcenter.heroku.com/articles/websockets)。这意味着您可以按照典型的 websocket 模式在 Heroku 上使用本机 websocket 应用程序。

      在我刚刚链接到您的文档中,有一个示例 Node 应用程序——它还特别概述了它的工作原理。

      最后——关于子域——您链接到的其他 Stack Overflow 帖子不再准确。 Heroku 很久以前就添加了对通配符域的支持(通常用于多租户目的)。

      这意味着,如果您正在构建一个应用程序,希望根据子域动态地为用户提供页面:那么您很幸运!这是完全支持的。你可以这样说:

      $ heroku domains:add *.example.com
      

      当您更新您的 DNS 以指向通配符时,您应该开始看到所有子域请求都进入您的 Heroku 应用程序。

      要了解有关 Heroku + 子域的更多信息,他们在这里有一篇很棒的文章:https://devcenter.heroku.com/articles/custom-domains#add-a-wildcard-domain

      【讨论】:

      • 不错的解决方案。我最终找到了一种方法来重构在同一个端口上同时使用 websockets 和 http(请参阅下面的答案),但是我将这个标记为正确的,因为问题是关于如何为多个端口执行此操作,这确实解决了那个。
      • 虽然您可以在您的个人资料中列出多个 dyno,但只有 web 会接受入站 http 请求。见devcenter.heroku.com/articles/http-routing(私人空间可能有所不同)
      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2020-07-06
      • 2012-04-26
      • 2018-03-03
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      相关资源
      最近更新 更多