web-dev-qa-db-ja.com

同じポートのバックエンドとフロントエンド

AWSにec2 Windowsインスタンスがあり、ポート80のフロントエンドで応答します。バックエンドはポート5000で実行しています。残りのクライアントのポートを使用せずに、同じポートでフロントエンドとバックエンドの両方をホストできる方法はありますか? API?

フロントエンド:

www.example.com

現在のバックエンド:

www.example.com:5000

私がそれを望んでいるもの:

www.example.com/backend/

バックエンドルートとフロントエンドルートの両方に単一のindex.jsまたはserver.jsファイルを書き込むにはどうすればよいですか?

9
Vivek Gautam

確かに、同じポートで両方をホストするのは簡単です。ルーティングの問題です。

たとえば、express.jsを使用し、publicという名前のフォルダーに静的ファイル(CSS、画像、HTMLなど)があるとします。

const express = require('express')
const app = express()

app.use('/', express.static('public'))
app.get('/backend', (req, res) => res.send('Hello World!'))

app.listen(80, () => console.log('Example app listening on port 80!'))

ファイルを作成する場合public/index.html

<html>HI</html>

次に、curl 'localhost:80/'を実行して、それ(「フロントエンド」)を取得できます。

$ curl 'localhost:80/'
<html>HI</html>
$

「バックエンド」にアクセスすることもできます。

$ curl 'localhost:80/backend'
Hello World!
$
0
Avery

サブドメイン でサービスエンドポイントを分離することをお勧めします

サービスエンドポイント

エンドポイントは、HTMLファイルまたはアクティブなサーバーページが公開される接続ポイントです。エンドポイントは、Webサービスエンドポイントのアドレス指定に必要な情報を提供します。エンドポイントは、メッセージアドレッシングプロパティのグループまたはファミリを定義するために使用される参照または仕様を提供し、エンドポイントの送信元および宛先の参照などのエンドツーエンドのメッセージ特性を提供し、メッセージのアイデンティティを統一して「独立した」メッセージのアドレス指定。エンドポイントは、PC、PDA、またはPOS端末にすることができますリファレンス:サービスエンドポイントの定義

フロントエンドエンドポイントの場合、推奨されるサブドメインは次のとおりです。

  • http:// www.example.com
  • http://example.comこの場合、サブドメインwwwにリダイレクトする必要があります

バックエンドエンドポイントには、何でも使用できますが、バックエンドの推奨サブドメインは次のとおりです。

  • http:// api.example.com(最も使用されている)
  • http:// backend.example.com

したがって、あなたの場合の推奨事項は次のとおりです。

Nginx のようなリバースプロキシを使用するか、NodeJのリクエストオブジェクトからサブドメインを取得することで、これを実現できます。

Nginxは、リバースプロキシ、ロードバランサー、およびHTTPキャッシュとしても使用できるWebサーバーです。このソフトウェアは、Igor Sysoevによって作成され、2004年に最初に公開されました。同じ名前の会社がサポートを提供するために2011年に設立されました。

最初のアプローチ

HTTPロードバランサーとしてNginxを使用

次のように、サーバーへのリクエストのバランスをとるようにNginxを設定できます:

http {
    upstream backend {
        server localhost:5000;
    }

    upstream frontend {
        server localhost;
    }

    server {
        listen 80;

        server_name api.example.com;
        location / {
            proxy_pass http://backend;
        }
    }

    server {
        listen 80;

        server_name www.example.com example.com;
        location / {
            proxy_pass http://frontend;
        }
    }
}

第二のアプローチ

expressjs を使用して、リクエストオブジェクトからサブドメインを取得します。

req.subdomains

リクエストのドメイン名に含まれるサブドメインの配列。

ドキュメント:

// Host: "tobi.ferrets.example.com"
req.subdomains
// => ["ferrets", "tobi"]

あなたの場合、可能なサブドメインは次のとおりです:wwwまたはapi

// Host: "www.example.com"
req.subdomains
// => ["www"]

または

// Host: "api.example.com"
req.subdomains
// => ["api"]

これは、server.js内でリクエストを処理する方法です

var subDomain = req.subdomains[0];

if (subdomain === 'api') {
    processBackendRequest();
} else {
    processFrontendRequest();
}
7
Ele

ポート番号を指定する必要がない唯一の実際の方法は、HTTPの場合はポスト80、HTTPSの場合は443を使用することです。

IIS=を実行している場合は、フロントエンドを「example.com」というWebサイトとして実行し、そのWebサイトの下に「バックエンド」という別の「アプリケーション」を置くことができます。

Www.example.comに対するすべてのHTTPリクエストは、ルートWebサイトに送信されます。 www.example.com/backendへのリクエストは、example.com Webサイトの下の「バックエンド」アプリケーションにルーティングされます。

ServerFaultは、IISの質問をするのにより適切な場所です。

0
Phil Golding