繁体   English   中英

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 编写的应用服务器中,我有多个端口的内部代理:

  • 在我的8080端口中,我有我的rest api
  • 在我的3000端口中,我有我的推送服务器和聊天

我使用 npm 包subdomain-router进行端口的内部路由,在“前端”中公开子域,这些子域代理回这些端口。
代码演示: <some-app>显然不是<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 error page。

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

当尝试通过在 url 中指定端口(例如: <some-app>.herokuapp.com:8080 )来访问我的 API 时,我在浏览器(谷歌浏览器)中收到以下错误: ERR_CONNECTION_REFUSED

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

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

谢谢!
阿米特

好的,经过一些研究,我发现在 Heroku 中打开端口是disablednot allowed

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

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

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

希望对一些人有所帮助。

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

如果您使用的是 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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM