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

正如我从SE上的其他问题了解到的,在Heroku应用程序中使用多个端口是不可能的,因为Heroku为端口指定了一个环境variables。

有没有推荐的方法来解决这个问题? 我见过一些使用子域的代理模块:

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

不过,在这篇文章中:

如何在heroku上为应用程序创build一个subsubdomain :(例如,sub.myapp.herokuapp.com)

这表明heroku中的子域名不再可能。

在我的应用程序中,我正在使用express来提供我的内容,并且有一个websocket服务器用于同步一些实时内容,而这些内容都需要一个端口。 我的问题是,是否可以在heroku中使用子域名?推荐使用多个端口的Web应用程序的方式是什么?

所以,要回答你的问题:

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

但是,您可以运行多个Heroku dynos,每个运行不同的命令。 这使您可以在同一个项目中在Heroku上运行不同的“服务器types”。 这样做的方法是指定如何在Procfile运行不同types的服务器,例如:

 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 )。 这意味着你可以使用Heroku上的本地websocket应用程序,遵循典型的websocket模式。

在我刚刚链接到的文档中,有一个Node应用程序示例 – 它还特别描述了它的工作原理。

最后 – 关于子域名 – 你链接到的其他堆栈溢出post不再准确。 Heroku很早以前就增加了对通配符域的支持(通常用于多租户的目的)。

这意味着如果您正在构build一个应用程序,并希望根据子域为用户dynamic提供页面,那么您很幸运! 这完全支持。 你可以这样说:

 $ heroku domains:add *.example.com 

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

要了解有关Heroku +子域名的更多信息,请点击这里: https : //devcenter.heroku.com/articles/custom-domains#add-a-wildcard-domain

我最终发现你可以使用相同的端口为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(…)等