web-dev-qa-db-ja.com

WebアプリケーションとAPIを別々にして、同じサーバーからホストするにはどうすればよいですか?

.NET 4.5で作成された2つの別々のアプリケーション、Web ApiアプリケーションとMVCアプリケーションがあるとします。 IIS)でMVCアプリケーションをホストする場合は、ホストヘッダー " https://www.mymvcapp.com/ "でWebをホストすることができます。 IIS Hostヘッダーの下にあるAPIアプリケーションを個別に " https://www.mymvcapp.com/api/ "?

IISで2つのアプリケーションを実行するプロセスは分離する必要があります。IISを使用したホスティング、セルフホスティング、ホスティングの個別の方法を知っています。IIS可能な場合。

また、http://www.mymvcapp.com/apiからapiを提供できるように、2つのアプリケーション(APIとWebアプリケーション)を別々のサーバーに置いた場合、どのようにホストしますか?

24
boosts

やりたいことを行うには、少なくとも4つの方法があります。最初の2つの方法は、1つのWebサーバーがあり、IISを実行しているその1つのWebサーバーから両方のアプリケーションが提供される場合に使用します。この方法は、APIとWebサイトが同じサーバーで実行されている限り、ロードバランサーの背後で複数のWebサーバーが実行されている場合にも機能します。

2番目の2つの方法は、「リバースプロキシ」と呼ばれるものを使用しています。これは、受信するトラフィックのタイプに応じて、1つのサーバー(プロキシサーバー)から複数の内部サーバーにトラフィックをルーティングする方法です。これは、一連のサーバーでWebサーバーを実行し、API 別のサーバーのセットを実行する場合に使用します。過去に両方を使用したことがあるので、必要なリバースプロキシソフトウェアを使用できます。nginxとHAProxyについて触れます。

IISを実行する単一のWebサーバー

IISでこれを行うには2つの方法があります。

物理フォルダー構造が次のとおりである場合:

c:\sites\mymvcapp
c:\sites\mymvcapp\api

次のことができます。

子アプリケーションを作成する

子アプリケーションを作成すると、ルーティングの変更を必要とせずに、「API」サイトにwww.mymvcapp.com/apiからアクセスできるようになります。

それを行うには:

  • オープンIISマネージャー
  • 左側の「サイト」フォルダツリーで適切なサイトをクリックします
  • APIフォルダを右クリックします
  • 「アプリケーションに変換」をクリックします

欠点は、すべての子アプリケーションがその親のWeb構成を継承することであり、そこで競合する設定がある場合、実行時の奇妙さが表示されます(それがまったく機能する場合)。

ディレクトリジャンクションを作成する

2番目の方法は、アプリケーションがその分離性を維持できるようにするための方法です。また、ルーティングを行う必要はありません。

2つのフォルダー構造を想定します。

c:\sites\api
c:\sites\mvcapp

Windowsでジャンクションを設定できます。コマンドラインから*:

cd c:\sites
mklink /D /J mymvcapp c:\sites\mvcapp
cd mymvcapp
mklink /D /J api c:\sites\api

次にIIS Managerに移動し、両方をアプリケーションに変換します。これにより、API\api\で利用可能になりますが、実際にはそのweb.config設定を共有しません親と。

複数のサーバー

Nginxまたはhaproxyをリバースプロキシとして使用する場合は、コールを各アプリにルーティングするように設定できます。

nginxリバースプロキシ設定

Nginx.confで(ベストプラクティスは、sites-enabledへのシンボリックリンクであるsites-available confを作成することです。デプロイするたびにそのシンボリックリンクを破棄できます)。

location / {
    proxy_pass http://mymvcapp.com:80
}
location /api {
    proxy_pass http://mymvcapp.com:81
}

次に、正しいIIS設定を設定して、各サイトがポート80(mymvcapp)およびポート81(api)でリッスンするようにします。

HAProxy

acl acl_WEB hdr_beg(Host) -i mymvcapp.com
acl acl_API path_beg -i /api

use_backend API if acl_API
use_backend WEB if acl_WEB

backend API
server web mymvcapp.com:81

backend WEB
server web mymvcapp.com:80

* Junctionコマンドをメモリから発行しています。これは数か月前に行ったが最近ではないので、コマンドに問題がある場合はお知らせください

[〜#〜] nb [〜#〜]:設定ファイルは完全な設定ファイルではなく、リバースプロキシに必要な設定を示すためだけのものです。環境によっては、設定が必要なその他の設定がある場合があります。

30
George Stocker