据我从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应用程序的推荐方法是什么?
答案 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(...)等。