Heroku + node.js:我有一台使用多个端口的服务器。我怎样才能让 Heroku 分配它们?

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

嗯,我会尽量说得更清楚..

在我在node.js中编写的应用程序服务器中,我有多个端口的内部代理:

我使用 npm 包 subdomain-router 进行到端口的内部路由,暴露 'front-end' 中的子域,代理回那些端口。
代码演示: <some-app>显然不是app的真实名称)

require('subdomain-router')
({
  host: '<some-app>.herokuapp.com',
  subdomains:
  {
    '': 8080,   // <some-app>.herokuapp.com <=> ::8080   --WORKS--
    'api': 8080,  // api.<some-app>.herokuapp.com <=> ::8080
    'chat': 3000, // chat.<some-app>.herokuapp.com <=> ::3000
    'push': 3000  // push.<some-app>.herokuapp.com <=> ::3000
  }
}).listen(process.env.PORT || 5000);

API 效果很好,虽然我无法通过 <some-app>.herokuapp.com:8080 访问它,但只能通过 <some-app>.herokuapp.com 访问它,让内部 subdomain-router 模块发挥它的魔力。
另外,我无法访问子域。尝试访问 api.<some-app>.herokuapp.com 时,我从 heroku 收到 No such app 错误页面。

TL;DR 访问 <some-app>.herokuapp.com 有效(重定向到我的 API 的 /v1 路径),但无法访问 <some-app>.herokuapp.com:8080<some-app>.herokuapp.com:3000chat.<some-app>.herokuapp.com.

当尝试通过在 url 中指定端口访问我的 API 时( 像这样:<some-app>.herokuapp.com:8080),我得到了我的浏览器出现以下错误 (google chrome):ERR_CONNECTION_REFUSED.

我有根据的猜测 说这可能与在 heroku 中 opening ports 有关,但我不知道该怎么做它(尝试用谷歌搜索 ofc)。
它并没有解释为什么我无法访问子域。

希望能对此问题有所了解。
我是 heroku 的新手,它变得非常令人沮丧。

谢谢!
阿米特

好的,在做了一些研究后我发现在 Heroku 中打开端口是 disablednot allowed.

解决此问题的唯一方法是使用子域,然后在应用内使用代理模块(如subdomain-router 我用的)。

但是 - Heroku 不允许您在其域上创建子域,这意味着 your-app.herokuapp.com 是固定的并且不能有子域。
在 Heroku 手册中,他们要求您拥有自己的域和 dns 提供商来执行此操作,方法是在域设置中的 dns table 中创建 A 别名(CNAME),这将引用您的应用程序 herokuapp 域,然后使用命令 heroku domains:add 将您的域添加到允许的来源列表。

您可以阅读更多内容 here。它提供了您需要的所有信息。

希望对大家有所帮助。

我今天也了解到这个,我了解到如果你运行一个服务在Heroku的一个端口上,你仍然可以在本地访问它。不会解决上述用户的问题,但它确实解决了我的问题,这让我想到了这个问题。

我知道这是旧的 post,但我想提供最新的回复以供参考和将来使用:

如果您使用的是 socket-io,则绑定到同一端口很容易。其他 websocket 库应该有类似的方法(来自 https://github.com/socketio/socket.io#how-to-use):

In conjunction with Express Starting with 3.0, express applications have become request handler functions that you pass to http or http Server instances. You need to pass the Server to socket.io, and not the express application function. Also make sure to call .listen on the server, not the app.

const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);

您现在将拥有流经单个端口的 http 和 ws 流量(Heroku 不会单独路由 http/tcp,否则您的 websockets 将无法正常工作)。

由于环境奇偶校验和测试,我更喜欢这种方法,即不需要设置子域或端口路由