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

Ami*_*ron 23 deployment subdomain port heroku node.js

嗯,我会试着更清楚..

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

  • 在我的8080港口我有我的休息api.
  • 在我的3000端口我有我的推送服务器和聊天.

我使用npm包子域路由器进行内部路由到端口,将"前端"中的子域暴露给那些代理回到那些端口.
代码演示: (<some-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);
Run Code Online (Sandbox Code Playgroud)

API工作得很好,虽然我无法访问它<some-app>.herokuapp.com:8080,但只能通过<some-app>.herokuapp.com内部subdomain-router模块来实现它的魔力.
此外,我无法访问子域.在尝试访问时,api.<some-app>.herokuapp.comNo such app从heroku 获取错误页面.

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

当试图通过在URL中指定端口来访问我的API(像这样:<some-app>.herokuapp.com:8080),我得到了我的浏览器(谷歌浏览器)以下错误:ERR_CONNECTION_REFUSED.

我的有根据的猜测说,这可能与在heroku中打开端口有关,但我不知道如何做到这一点(尝试谷歌搜索).
它没有解释为什么我不能访问子域.

希望在这个问题上有任何亮点.
我是heroku的新手,而且非常令人沮丧.

谢谢!
阿米特

Ami*_*ron 20

好的,经过一些研究后我发现Heroku中的开放端口已禁用不允许.

解决这个问题的唯一方法是使用子域,然后在应用程序中使用代理模块(就像subdomain-router我使用的那样).

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

你可以在这里阅读更多.它提供了您需要的所有信息.

希望它有所帮助.

  • 是的,你只会有一个端口,但你可以通过那里为你的 websockets 以及 HTTP 请求提供服务。 (2认同)

myf*_*ult 8

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

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

与 Express 结合 从 3.0 开始,express 应用程序已成为您传递给 http 或 http 服务器实例的请求处理函数。您需要将 Server 传递给 socket.io,而不是 express 应用程序函数。还要确保在服务器上调用 .listen,而不是应用程序。

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

您现在将拥有流经单个端口的 http 和 ws 流量(Heroku 不会单独路由 http/tcp,如果这样做,您的 websockets 将无法工作)。

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