えっと、もっとはっきりさせようと思います。
私がnode.jsで作成したアプリケーションサーバーでは、複数のポートの内部プロキシがあります。
8080
ポートには、rest apiがあります。3000
ポートには、Pushサーバーとチャットがあります。私はポートへの内部ルーティングにnpmパッケージ subdomain-router を使用して、これらのポートにプロキシする「フロントエンド」のサブドメインを公開します。
コードのデモ:(<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);
<some-app>.herokuapp.com:8080
を介してアクセスすることはできませんが、<some-app>.herokuapp.com
を介してのみアクセスでき、内部のsubdomain-router
モジュールに魔法をかけることで、APIはうまく機能します。
また、サブドメインにアクセスできません。 api.<some-app>.herokuapp.com
にアクセスしようとすると、herokuからNo such app
エラーページが表示されます。
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にアクセスしようとすると、ブラウザー(google chrome)で次のエラーが発生します:ERR_CONNECTION_REFUSED
。
私の経験に基づく推測は、ポートの開放に関連している可能性があると言っていますheroku、しかし私はそれを行う方法についての手がかりがありません(グーグルで試してみました)。
サブドメインにアクセスできない理由は説明されていません。
この問題に当てはまる光があれば幸いです。
私はherokuを使い始めたばかりで、本当にイライラしています。
ありがとう!
アミット
さて、いくつかの調査を行った後、Herokuでポートを開くことはdisabledであり、は許可されない。
これを回避する唯一の方法は、サブドメインを使用してから-プロキシモジュールを使用するためのアプリ(subdomain-router
など)。
[〜#〜] but [〜#〜]-Herokuではドメインにサブドメインを作成できません。つまり、your-app.herokuapp.com
は固定されており、サブドメインを持つことはできません。
Herokuのマニュアルでは、ドメイン設定のdnsテーブルにアプリのherokuappを参照するAエイリアス(CNAME)を作成することにより、独自のドメインとDNSプロバイダーにそのようなことを要求していますドメイン、次にコマンドheroku domains:add
を使用して、ドメインを許可されたオリジンリストに追加します。
あなたはもっと読むことができます ここ 。それはあなたが必要とするすべての情報を提供します。
それが一部に役立つことを願っています。
私はこれが古い投稿であることを知っていますが、参照と将来の使用のために最新の応答を提供したいと思いました。
Socket-ioを使用している場合、同じポートへのバインドは簡単です。他のwebsocketライブラリには同様のアプローチが必要です( https://github.com/socketio/socket.io から):
Express 3.0以降、Expressアプリケーションは、httpまたはhttp Serverインスタンスに渡すリクエストハンドラー関数になりました。 Expressアプリケーション関数ではなく、サーバーをsocket.ioに渡す必要があります。また、アプリではなくサーバーで.listenを呼び出すようにしてください。
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);
これで、1つのポートを介してhttp&wsトラフィックが流れます(Herokuは、http/tcpを個別にルーティングしませんでした(Webソケットが機能しなかった場合)。 express以外のフレームワークとのバインドが可能です:( https://github.com/socketio/socket.io )。
環境のパリティとテストのため、つまりサブドメインやポートルーティングをセットアップする必要がないため、この方法を選択します
今日、これについても学びました。Herokuのポートでサービスを実行すると、ローカルでアクセスできることを学びました。上記のユーザーの懸念に対しては機能しませんが、この問題につながった私の問題は解決しました。