如何让我的 node/socket.io 应用程序在部署到 heroku 时使用正确的端口?
How do I get my node/socket.io app to use the correct port when deployed to heroku?
我遵循了 socket.io 的在线聊天教程,您在其中制作了一个聊天应用程序。在我的 app.js 文件中(我使用了 express 生成器)我有...
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这意味着我需要浏览到(因此我的套接字服务器是 运行ning 来自)...
在我的页面上有几行...
var socket = io.connect('http://localhost:3000');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
当我 运行 本地应用程序时,套接字应用程序工作。然而,为了部署它,我使用了 heroku/node buildpack,当我的应用程序被部署时,它在端口 80 上 运行ning,例如在 app.heroku.com 上。我有两个问题...
1) 为什么我的应用在部署时位于不同的端口? (这是在哪里发生的?)
2) 如何将我的页面设置为始终查看正确的 url 和端口?
当 运行通过 Heroku 连接时,您应该连接到端口 80。如果您希望本地和 Heroku 实现都适用于您的客户端代码,请更改此设置:
var port = normalizePort(process.env.PORT || '3000');
对此:
var port = normalizePort(process.env.PORT || '80');
并且,确保您的本地安装在端口 80 上具有 运行 的权限。然后,您的客户端始终可以在本地或通过 Heroku 在端口 80 上访问它。
或者,如果出于特权原因不方便在本地使用端口 80 运行,那么您可以将端口 3000 留在那里进行本地安装,并在本地服务器上配置本地 iptable,以便端口 80 请求自动转发到服务器进程所在的3000端口。
Heroku 使用共享基础架构,运行在同一台服务器上连接许多不同的进程,每个进程 运行连接在其自己的端口上,由 process.env.PORT
指定,该端口单独配置每个单独的服务器进程。
但是,当您的特定域在端口 80 上被访问时,您的进程 运行 在服务器前面的某种网络基础设施(可能是某种路由器或负载平衡器)将重定向您域上的端口 80 请求到您的进程正在 运行 上的实际服务器上的端口 process.env.PORT
请求。因此,会发生两件事。 1) 多个服务器进程可以 运行 在同一个服务器盒上,每个进程都有自己唯一的端口,并且 2) 每个单独的域都可以在端口 80 上访问,该端口将自动转发到进程实际所在的任何端口 运行ning 在实际的服务器盒上。
顺便说一句,如果您将客户端代码更改为:
io.connect();
然后,客户端将只连接到网页加载的任何端口(自动使用相同的来源),这几乎总是您想要的。
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这很好。请记住,这不会执行任何操作,它只是您应用中任意设置的值。为了在那个端口上监听,你必须稍后告诉你的服务器监听,比如 app.listen(app.get('port'))
.
var socket = io.connect('http://localhost:3000');
这就是您要更改的内容:
var socket = io.connect();
当您在 Heroku 上托管时,您连接的不是 "localhost:3000"(而是 yourapp.herokuapp.com:80 或 customdomain.com:80)。因此,通过指定 localhost:3000,您注定 socket.io 无法找到自己的服务器。
我遵循了 socket.io 的在线聊天教程,您在其中制作了一个聊天应用程序。在我的 app.js 文件中(我使用了 express 生成器)我有...
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这意味着我需要浏览到(因此我的套接字服务器是 运行ning 来自)...
在我的页面上有几行...
var socket = io.connect('http://localhost:3000');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
当我 运行 本地应用程序时,套接字应用程序工作。然而,为了部署它,我使用了 heroku/node buildpack,当我的应用程序被部署时,它在端口 80 上 运行ning,例如在 app.heroku.com 上。我有两个问题...
1) 为什么我的应用在部署时位于不同的端口? (这是在哪里发生的?) 2) 如何将我的页面设置为始终查看正确的 url 和端口?
当 运行通过 Heroku 连接时,您应该连接到端口 80。如果您希望本地和 Heroku 实现都适用于您的客户端代码,请更改此设置:
var port = normalizePort(process.env.PORT || '3000');
对此:
var port = normalizePort(process.env.PORT || '80');
并且,确保您的本地安装在端口 80 上具有 运行 的权限。然后,您的客户端始终可以在本地或通过 Heroku 在端口 80 上访问它。
或者,如果出于特权原因不方便在本地使用端口 80 运行,那么您可以将端口 3000 留在那里进行本地安装,并在本地服务器上配置本地 iptable,以便端口 80 请求自动转发到服务器进程所在的3000端口。
Heroku 使用共享基础架构,运行在同一台服务器上连接许多不同的进程,每个进程 运行连接在其自己的端口上,由 process.env.PORT
指定,该端口单独配置每个单独的服务器进程。
但是,当您的特定域在端口 80 上被访问时,您的进程 运行 在服务器前面的某种网络基础设施(可能是某种路由器或负载平衡器)将重定向您域上的端口 80 请求到您的进程正在 运行 上的实际服务器上的端口 process.env.PORT
请求。因此,会发生两件事。 1) 多个服务器进程可以 运行 在同一个服务器盒上,每个进程都有自己唯一的端口,并且 2) 每个单独的域都可以在端口 80 上访问,该端口将自动转发到进程实际所在的任何端口 运行ning 在实际的服务器盒上。
顺便说一句,如果您将客户端代码更改为:
io.connect();
然后,客户端将只连接到网页加载的任何端口(自动使用相同的来源),这几乎总是您想要的。
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
这很好。请记住,这不会执行任何操作,它只是您应用中任意设置的值。为了在那个端口上监听,你必须稍后告诉你的服务器监听,比如 app.listen(app.get('port'))
.
var socket = io.connect('http://localhost:3000');
这就是您要更改的内容:
var socket = io.connect();
当您在 Heroku 上托管时,您连接的不是 "localhost:3000"(而是 yourapp.herokuapp.com:80 或 customdomain.com:80)。因此,通过指定 localhost:3000,您注定 socket.io 无法找到自己的服务器。