使用 Heroku 的多端口应用的推荐方法
Recommended approach for multiport app using Heroku
正如我从 SE 的其他问题中了解到的那样,在 Heroku 应用程序中无法使用多个端口,因为 Heroku 会使用环境变量分配一个端口。
是否有解决此问题的推荐方法?我见过一些使用带有子域的代理模块:
然而,在这个 post:
How to create a subsubdomain for an app on heroku: (e.g. sub.myapp.herokuapp.com)
这表明在 heroku 中不再可能使用子域。
在我的应用程序中,我目前正在使用 express 提供我的内容,并有一个 websocket 服务器来同步一些实时内容,两者都需要一个端口。我的问题是,heroku 中是否可以使用子域?为需要多个端口的 Web 应用程序提供服务的推荐方式是什么?
所以,回答你的问题:
您不能在单个 Heroku dyno 的多个端口上拥有一个 运行 应用程序。
但是,您可以有多个 Heroku dynos 运行ning,每个 运行ning 不同的命令。这允许您在同一项目中的 Heroku 上 运行 不同的 'types' 服务器。您执行此操作的方法是指定如何 运行 您在 Procfile
中的不同类型的服务器,例如:
web: node server.js
other-web: node other-server.js
对于 运行 server.js
的一个实例和 other-server.js
的一个实例,您可以简单地告诉 Heroku 运行 这些进程作为测功机,如下所示:
$ heroku ps:scale web=1 other-web=1
现在——关于 websockets,从几年前开始,Heroku 原生支持它们(您可以在这里阅读更多相关信息:https://devcenter.heroku.com/articles/websockets)。这意味着您可以按照典型的 websocket 模式在 Heroku 上使用本机 websocket 应用程序。
在我刚刚链接到的文档中,有一个示例 Node 应用程序——它还具体概述了它的工作原理。
最后 - 关于子域 - 您链接到的另一个 Stack Overflow post 不再准确。 Heroku 很久以前就添加了对通配符域的支持(通常用于 multi-tenancy 目的)。
这意味着如果您正在构建一个应用程序,您希望在其中基于子域向用户动态提供页面:您很幸运!这是完全支持的。你可以这样说:
$ 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 时的 return 值是服务器,你实际上可以直接将它传递给 socketIO。从那里你可以做 io.on(...) 等
正如我从 SE 的其他问题中了解到的那样,在 Heroku 应用程序中无法使用多个端口,因为 Heroku 会使用环境变量分配一个端口。
是否有解决此问题的推荐方法?我见过一些使用带有子域的代理模块:
然而,在这个 post:
How to create a subsubdomain for an app on heroku: (e.g. sub.myapp.herokuapp.com)
这表明在 heroku 中不再可能使用子域。
在我的应用程序中,我目前正在使用 express 提供我的内容,并有一个 websocket 服务器来同步一些实时内容,两者都需要一个端口。我的问题是,heroku 中是否可以使用子域?为需要多个端口的 Web 应用程序提供服务的推荐方式是什么?
所以,回答你的问题:
您不能在单个 Heroku dyno 的多个端口上拥有一个 运行 应用程序。
但是,您可以有多个 Heroku dynos 运行ning,每个 运行ning 不同的命令。这允许您在同一项目中的 Heroku 上 运行 不同的 'types' 服务器。您执行此操作的方法是指定如何 运行 您在 Procfile
中的不同类型的服务器,例如:
web: node server.js
other-web: node other-server.js
对于 运行 server.js
的一个实例和 other-server.js
的一个实例,您可以简单地告诉 Heroku 运行 这些进程作为测功机,如下所示:
$ heroku ps:scale web=1 other-web=1
现在——关于 websockets,从几年前开始,Heroku 原生支持它们(您可以在这里阅读更多相关信息:https://devcenter.heroku.com/articles/websockets)。这意味着您可以按照典型的 websocket 模式在 Heroku 上使用本机 websocket 应用程序。
在我刚刚链接到的文档中,有一个示例 Node 应用程序——它还具体概述了它的工作原理。
最后 - 关于子域 - 您链接到的另一个 Stack Overflow post 不再准确。 Heroku 很久以前就添加了对通配符域的支持(通常用于 multi-tenancy 目的)。
这意味着如果您正在构建一个应用程序,您希望在其中基于子域向用户动态提供页面:您很幸运!这是完全支持的。你可以这样说:
$ 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 时的 return 值是服务器,你实际上可以直接将它传递给 socketIO。从那里你可以做 io.on(...) 等