簡體   English   中英

Heroku + node.js:我有一個使用多個端口的服務器。 我怎樣才能讓 Heroku 分配它們?

[英]Heroku + node.js: I have a server which uses multiple ports. How can I get Heroku to allocate them?

嗯,我會盡量說得更清楚。

在我用 node.js 編寫的應用服務器中,我有多個端口的內部代理:

  • 在我的8080端口中,我有我的rest api
  • 在我的3000端口中,我有我的推送服務器和聊天

我使用 npm 包subdomain-router進行端口的內部路由,在“前端”中公開子域,這些子域代理回這些端口。
代碼演示: <some-app>顯然不是<some-app>的真名)

require('subdomain-router')
({
  host: '<some-app>.herokuapp.com',
  subdomains:
  {
    '': 8080,   // <some-app>.herokuapp.com <=> ::8080   --WORKS--
    'api': 8080,  // api.<some-app>.herokuapp.com <=> ::8080
    'chat': 3000, // chat.<some-app>.herokuapp.com <=> ::3000
    'push': 3000  // push.<some-app>.herokuapp.com <=> ::3000
  }
}).listen(process.env.PORT || 5000);

API 工作得很好,雖然我不能通過<some-app>.herokuapp.com:8080訪問它,但只能通過<some-app>.herokuapp.com並讓內部subdomain-router模塊來做它的魔法。
另外,我無法訪問子域。 當嘗試訪問api.<some-app>.herokuapp.com我從 heroku 得到No such app error page。

TL;DR訪問<some-app>.herokuapp.com有效(重定向到我的 API 的/v1路徑),但無法訪問<some-app>.herokuapp.com:8080<some-app>.herokuapp.com:3000chat.<some-app>.herokuapp.com

當嘗試通過在 url 中指定端口(例如: <some-app>.herokuapp.com:8080 )來訪問我的 API 時,我在瀏覽器(谷歌瀏覽器)中收到以下錯誤: ERR_CONNECTION_REFUSED

我有根據的猜測說這可能與在 heroku 中打開端口有關,但我不知道如何去做(嘗試使用谷歌搜索 ofc)。
它並沒有解釋為什么我無法訪問子域。

希望對這個問題有所了解。
我是 Heroku 的新手,它變得非常令人沮喪。

謝謝!
阿米特

好的,經過一些研究,我發現在 Heroku 中打開端口是disablednot allowed

解決這個問題的唯一方法是使用子域,然后在應用程序中使用代理模塊(如我使用的subdomain-router )。

但是- Heroku 不允許你在他們的域上創建子域,這意味着your-app.herokuapp.com是固定的,不能有子域。
在 Heroku 手冊中,他們要求您擁有自己的域和 dns 提供商來執行此操作,方法是在域設置的 dns 表中創建一個 A 別名(CNAME),該別名將引用您的應用程序 herokuapp 域,然后使用命令heroku domains:add將您的域heroku domains:add到允許的源列表中。

您可以在此處閱讀更多內容。 它提供了您需要的所有信息。

希望對一些人有所幫助。

我知道這是一篇舊帖子,但我想提供最新的回復以供參考和將來使用:

如果您使用的是 socket-io,綁定到同一個端口很容易。 其他 websocket 庫應該有類似的方法(來自https://github.com/socketio/socket.io#how-to-use ):

與 Express 結合 從 3.0 開始,express 應用程序已成為您傳遞給 http 或 http 服務器實例的請求處理函數。 您需要將 Server 傳遞給 socket.io,而不是 express 應用程序函數。 還要確保在服務器上調用 .listen,而不是應用程序。

const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);

您現在將擁有流經單個端口的 http 和 ws 流量(Heroku 不會單獨路由 http/tcp,如果這樣做,您的 websockets 將無法工作)。

由於環境奇偶校驗和測試,我更喜歡這種方法,即不需要設置子域或端口路由

我今天也了解了這一點,我了解到如果您在 Heroku 的端口上運行服務,您仍然可以在本地訪問它。 對上述用戶的關注不起作用,但它確實解決了我的問題,這導致我提出了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM