【问题标题】:how does heroku route requests to the correct port?heroku 如何将请求路由到正确的端口?
【发布时间】: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.

标签: node.js heroku


【解决方案1】:

请记住,Heroku 可能正在幕后进行一些路由。如果有请求进来,它不一定会命中您的应用程序(例如,运行 Express)。它很可能会遇到像 nginx 这样的东西,它可以根据主机名进行自己的内部路由。

语句 server.listen(process.env.PORT || 8000) 指定端口 - 它是 process.env.PORT 的值(通过在命令行上设置 PORT=80(或 PORT=443)指定)或使用端口 8000 作为默认值.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2021-12-19
    • 2013-04-09
    • 2023-03-23
    • 2020-04-16
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多