使用Heroku的多端口应用程序的推荐方法

时间:2017-01-17 06:06:35

标签: node.js heroku port reverse-proxy

据我从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应用程序的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

所以,回答你的问题:

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

然而,你可以运行多个Heroku dynos,每个都运行不同的命令。这允许您在同一项目中的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应用程序。

在我刚刚链接到的文档中,有一个示例节点应用程序 - 它还概述了它的工作原理,具体而言。

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

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

$ heroku domains:add *.example.com

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

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

答案 1 :(得分:0)

我最终发现你实际上可以为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(...)等。