【发布时间】:2015-03-24 11:22:56
【问题描述】:
在阅读了几个 Heroku NodeJS 教程之后,我了解到 Heroku 通过“process.env.PORT”环境变量为您的应用程序分配一个随机端口,以及让您的应用程序在本地和本地工作的正确方法heroku 就是设置端口等于
process.env.PORT || 8000
,其中 8000 可以替换为当您在 localhost 上运行时您希望应用程序在其上运行的任何端口。
这是它在我的应用程序中的外观(“服务器”是 http 服务器,当前提供静态 HTML 文件):
server.listen(process.env.PORT || 8000)
当我在 heroku 上运行应用程序并检查日志时,我会看到 process.env.PORT 被分配了一个端口号...之前的部署是 29074。
当我在本地运行应用程序时,我通过 URL http://localhost:8000 进行连接。如果我不包含端口号,则页面不会加载(找不到页面)。
那么,当我连接到 heroku 上的页面时,为什么我不必在 URL 中指定端口 29074?我可以在不指定端口号的情况下访问 url https://limitless-brook-9339.herokuapp.com/ 并且加载正常。事实上,如果我尝试将 URL 中的端口明确设置为:29074,它会显示“此网页不可用”。
【问题讨论】:
-
每个请求仍然涉及一个端口号。 HTTP 和 HTTPS 都只有默认值(分别为
80和443),如果未指定另一个(如您在本地使用的8000),则使用这些默认值。如果您的本地计算机上尚未使用端口号,可以使用.listen(80)并访问http://localhost/。 -
据我了解,当我访问 limitless-brook-9339.herokuapp.com(因为它是 HTTPS)时,443 被隐式添加到 URL 中。但是当我检查我的heroku日志时,
process.env.PORT(因此,传递给server.listen的参数)等于29074。如果应用程序在heroku上运行时正在监听29074,我不知道我的请求如何如果我提供的端口是 443,则浏览器被正确路由。 -
Heroku 可能使用proxy server。这将侦听默认端口并将请求定向到分配的“私有”端口(在本例中为 29074)上的各个应用程序。它至少允许他们在一台服务器上托管多个应用程序。
-
太好了,感谢您的解释。所以我猜这意味着我在 heroku 上的应用程序实际上无法监听多个端口,因为 heroku 只会分配给我一个
process.env.PORT并且会自动将所有请求从 443 路由到这个端口? -
并非如此。您可以同时公开使用
80和443,尽管两者都会在您的应用程序中显示为代理后分配的端口,但Heroku restricts network access to dynos on any others.