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

问题描述 投票:19回答:3

嗯,我会试着更清楚..

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

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

我使用npm包subdomain-router进行内部路由到端口,暴露“前端”中的子域,代理回到那些端口。 代码演示:(<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);

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),我在浏览器中遇到以下错误(谷歌浏览器):ERR_CONNECTION_REFUSED

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

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

谢谢! 什么

node.js heroku deployment port subdomain
3个回答
19
投票

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

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

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

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

希望它有所帮助。


1
投票

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


1
投票

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

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

与Express Starting with 3.0一起使用时,快速应用程序已成为传递给http或http服务器实例的请求处理函数。您需要将服务器传递给socket.io,而不是快速应用程序功能。还要确保在服务器上调用.listen,而不是应用程序。


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不能工作期间)。与表达以外的框架绑定是可能的:(https://github.com/socketio/socket.io)。

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

© www.soinside.com 2019 - 2024. All rights reserved.