web-dev-qa-db-ja.com

Heroku + node.js:複数のポートを使用するサーバーがあります。 Herokuにそれらを割り当てるにはどうすればよいですか?

えっと、もっとはっきりさせようと思います。

私が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を使い始めたばかりで、本当にイライラしています。

ありがとう!
アミット

25
Amit Evron

さて、いくつかの調査を行った後、Herokuでポートを開くことはdisabledであり、は許可されない

これを回避する唯一の方法は、サブドメインを使用してから-プロキシモジュールを使用するためのアプリ(subdomain-routerなど)。

[〜#〜] but [〜#〜]-Herokuではドメインにサブドメインを作成できません。つまり、your-app.herokuapp.comは固定されており、サブドメインを持つことはできません。
Herokuのマニュアルでは、ドメイン設定のdnsテーブルにアプリのherokuappを参照するAエイリアス(CNAME)を作成することにより、独自のドメインとDNSプロバイダーにそのようなことを要求していますドメイン、次にコマンドheroku domains:addを使用して、ドメインを許可されたオリジンリストに追加します。

あなたはもっと読むことができます ここ 。それはあなたが必要とするすべての情報を提供します。

それが一部に役立つことを願っています。

21
Amit Evron

私はこれが古い投稿であることを知っていますが、参照と将来の使用のために最新の応答を提供したいと思いました。

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 )。

環境のパリティとテストのため、つまりサブドメインやポートルーティングをセットアップする必要がないため、この方法を選択します

3
myf4ult

今日、これについても学びました。Herokuのポートでサービスを実行すると、ローカルでアクセスできることを学びました。上記のユーザーの懸念に対しては機能しませんが、この問題につながった私の問題は解決しました。

2
Anthony