[英]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:3000
或chat.<some-app>.herokuapp.com
。
當嘗試通過在 url 中指定端口(例如: <some-app>.herokuapp.com:8080
)來訪問我的 API 時,我在瀏覽器(谷歌瀏覽器)中收到以下錯誤: ERR_CONNECTION_REFUSED
。
我有根據的猜測說這可能與在 heroku 中打開端口有關,但我不知道如何去做(嘗試使用谷歌搜索 ofc)。
它並沒有解釋為什么我無法訪問子域。
希望對這個問題有所了解。
我是 Heroku 的新手,它變得非常令人沮喪。
謝謝!
阿米特
好的,經過一些研究,我發現在 Heroku 中打開端口是disabled和not 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.