web-dev-qa-db-ja.com

同じシステムで複数のExpressサーバーを整理するにはどうすればよいですか?

1つのサーバーを使用して、複数のドメインに分散されている複数のNode.js Webアプリをホストしています。私の現在のプラクティスは、異なるポートで各アプリのExpressサーバーを実行し、正しいポート/ Expressサーバーにリクエストを単純にルーティング(リダイレクト)するベースサーバーを実行することです。これは機能しますが、ベースサーバーがすべてのHTTPリクエストをルーティングし(手動でリダイレクトすることにより)、ユーザーが[hostname.com]:8000でホストされているアプリを表示することを意味します。

少し調べた後、ルーティングのニーズに http-proxy を使用できることがわかりましたが、同じ上で複数のExpressサーバーを実行するためのベストプラクティスがあるかどうかを知りたいシステム。私がそれをやろうとしている方法は次のとおりです。

各Webアプリには、完全なExpressフォルダー構造(app.js、ルート、ビューなど)を持つ独自のフォルダーがあります。アプリはドメインごとにグループ化されるため、フォルダー構造の例は次のようになります。

    hostname.com/
        app.js
        routes/
        views/
        ...
        app1/
            app1.js
            routes/
            views/
            ...
        app2
        ...
    hostname2.com/
        app.js
        routes/
        views/
        ...

Node(または現在使用している forever で)を使用して各app.jsを個別に実行する必要があり、各アプリはクロスアプリリダイレクトを使用して内部で異なるポートを使用する必要がありますターゲットアプリのポートを指している。

だから、それが私の現在の計画です。それにはどのような問題があり、どのような落とし穴を避けなければなりませんか?最も重要なのは、この問題に対する確立された解決策がありますか?Node.js/Expressを使用して同じシステムで複数のWebアプリをホストする問題ですか?

編集:私は最終的にWebSocketsとHTTPSを使用する予定であり、私のセットアップがサポートできる帯域幅の量は私にとってほとんど重要ではありません-これは開発サーバーです(少なくとも今のところ)。 WebSocketsの問題を提起してくれたDavid Ellisに感謝します。

2回目の編集:EhevuTovとDavid Ellisの回答に感謝します。どちらも大いに役立ちました。私はまだアプリケーションの全体的な構造に落ち着いていますが、その質問は このStackOverflowの質問

3番目の編集:この質問を投稿して以来、いろいろな方法があります(さらに先に進みます)。 私のGitHubリポジトリ内のこのファイル をチェックしてください。これは、この質問に対する答えから学んだことを活用しています!

45
Aaron

Expressは Connect を使用するため、Connectの仮想ホストミドルウェアを使用できると確信しています。他の製品の他のvhostモジュールと同様に動作します。適切なコードをテストして表示するための複数のドメインはありませんが、次のようなものだと思います。

express.createServer()
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)

Expressサーバーが1つでは不十分な場合は、APIからNode.Clusterを使用することを検討してください。それでも十分でない場合、現在のプラクティスは、NginxなどのasnycリバースプロキシをExpressサーバーの前に配置し、プロキシをExpressサーバーに向けることです。

35
EhevuTov

WebSockets(または実際にHTTP 1.1の機能)を使用する必要がない場合、 代わりにNginXをプロキシとして使用できます

利点は、NginXが処理できる総負荷がNodeの方が高い(基本的にこの種のことを静的にコンパイルし、特殊化する))が、データをストリーミングする機能を失う(小さなチャンクを送信する)一度に)。

小規模なサイトの場合、または将来必要になる機能が不明な場合は、おそらくnode-http-proxyそして、プロキシがサーバーのボトルネックであることを実証できる場合にのみNginXに切り替えます。幸いなことに、後で必要になったとしても、NginXのセットアップは難しくありません。

6
David Ellis