YARP (Yet Another Reverse Proxy) のインストール

リバースプロキシソフトウェアの YARP (Yet Another Reverse Proxy) のインストールをします。

概要

Windows ServerでのリバースプロキシはIISによるURL書き換えの方法がありますが、 新しいリバースプロキシのアプリケーションとして、YARP (Yet Another Reverse Proxy)がMicrosoftからリリースされました。
この記事では、YARPによるシンプルなリバースプロキシを導入する手順を紹介します。

YARP はASP.NET Coreアプリケーションでルーティングをする仕組みのため、基本的なルーティングは設定ファイルで実装できますが、 カスタマイズされた処理の場合は、ソースコードにルーティングの処理やルールを実装して、ビルドしたアプリケーションを配置する必要があります。
そのため、基本的にはソースコードをビルドして配置する方法が一般的かと考えられます。
はじめにYARPのASP.NET Coreアプリケーションをビルドします。

手順:YARP アプリケーションのビルド (Version 2.x)

Visual Studio を起動し、空のASP.NET Coreアプリケーションのプロジェクトを作成します。


YARPのNuGetのページにアクセスして、インストールコマンドを確認します。


[NuGetパッケージ マネージャー コンソール]を表示し、次のコマンドを実行します。 NuGetパッケージのインストール手順の詳細は こちらの記事を参照してください。
NuGet\Install-Package Yarp.ReverseProxy -Version 2.0.0


コマンドを実行すると、YARPのパッケージがインストールされます。'

コード

Program.csファイルのコードを下記に変更します。
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();


appsettings.json ファイルを下記に変更します。
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  /*追加*/
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "destination1": {
            "Address": "https://example.com/"
          }
        }
      }
    }
  }
}

解説

appsettings.json にリバースプロキシのルールを記載しています。 上記の設定例では、すべてのアクセスを、https://example.com/ に振り向ける設定となっています。

実行結果

プロジェクトを実行し、アプリケーションルートにWebブラウザでアクセスします。
下図のhttp://example.com/ のページが表示されます。WebブラウザのアドレスバーはアプリケーションルートのURLのままですので、 リバースプロキシにより参照されていることが確認できます。

手順:YARP アプリケーションのビルド (Version 1.x)

Visual Studio を起動します。


プロジェクトを作成します。[ASP.NET Core(空)]のプロジェクトを作成します。


プロジェクト名を設定します。


フレームワークは".NET 6.0"を利用します。


ASP.NET Coreの空プロジェクトが作成できました。


YARPのNuGetのページにアクセスして、インストールコマンドを確認します。


[NuGetパッケージ マネージャー コンソール]を表示し、次のコマンドを実行します。 NuGetパッケージのインストール手順の詳細は こちらの記事を参照してください。
Install-Package Yarp.ReverseProxy -Version 1.1.1

コード

Program.csファイルのコードを下記に変更します。
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();

appsettings.json ファイルを下記に変更します。
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ReverseProxy": {
    "Routes": {
      "minimumroute": {
        "ClusterId": "minimumcluster",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "minimumcluster": {
        "Destinations": {
          "httpbin.org": {
            "Address": "https://httpbin.org/"
          }
        }
      }
    }
  }
}

解説

appsettings.json にリバースプロキシのルールを記載しています。 上記の設定例では、すべてのアクセスを、https://httpbin.org/ に振り向ける設定となっています。

実行結果

プロジェクトを実行し、アプリケーションルートにWebブラウザでアクセスします。
下図のhttp://httpbin.org/ のページが表示されます。WebブラウザのアドレスバーはアプリケーションルートのURLのままですので、 リバースプロキシにより参照されていることが確認できます。

サーバーへの配置:IIS ホスティング

ホスティング方法(プロセス マネージャー)の選択

ASP.NET CoreアプリケーションはIISでホスティングする方法とWindowsサービスとしてホスティングする方法があります。 このセクションでは、IISにホスティングする設定手順を紹介します。

アプリケーションの発行

ビルドしたYARPのアプリケーションを発行します。発行先はローカルマシンのフォルダーとします。 プロジェクトの発行手順はこちらの記事を参照してください。

IISのインストール

サーバーにIISをインストールします。インストール手順はこちらの記事を参照してください。

ASP.NET 6 Windows Hosting Bundle のインストール

ASP.NET Coreを実行するためのランタイム"ASP.NET 6 Windows Hosting Bundle"をインストールします。 インストール手順はこちらの記事を参照してください。

ファイルの配置

発行したアプリケーションのファイルをサーバーに配置します。今回は作成するサイトのドキュメントルートのディレクトリ(C:\inetpub\YARP)に配置しています。

IISサイトの作成

今回はリバースプロキシ用にサイトを作成します。

インターネット インフォメーション サービス (IIS) マネージャー を起動します。 左側のツリービューのサーバーノードの子ノードの[サイト]ノードをクリックして選択し右クリックします。 ポップアップメニューが表示されますので[Web サイトの追加]の項目をクリックします。(下図参照)。


[Webサイトの追加]ダイアログが表示されます。


[サイト名]とコンテンツディレクトリセクションの[物理パス]を設定します。 物理パスはこのサイトのドキュメントルートとなるディレクトリのパスです。今回はYARPのプログラムを配置した "C:\inetpub\YARP" を物理パスとして設定します。
設定ができたらウィンドウの [OK]ボタンをクリックします。


Webサイトが作成されました。

アプリケーションプールの設定

サイトルートのデフォルトのアプリケーションプールの設定を確認します。左側のツリービューのノードで作成したサイトのノードをクリックして選択し、右クリックします。 ポップアップメニューが表示されますので、[Webサイトの管理]のサブメニューの[詳細設定...]の項目をクリックします。


[詳細設定]ダイアログが表示されます。[アプリケーションプール]の欄が設定されていることを確認します。確認ができたらダイアログを閉じます。


続いてアプリケーションプールの設定を確認します。左側のツリービューのサーバーノードの下の[アプリケーション プール]のノードをクリックして選択します。 下図の画面が表示されます。作成したサイト名と同じ名称のアプリケーションプールが作成されていることを確認します。
アプリケーションプールの ".Net CLR バージョンが" "v4.0"になっていますので、この設定を変更します。作成したサイトのアプリケーションプールの項目をダブルクリック、 または、右クリックして表示されるポップアップメニューの[基本設定]の項目をクリックします。


下図の[アプリケーション プールの編集]ダイアログが表示されます。[.Net CLR バージョン]の項目のコンボボックスをクリックします。 ドロップダウンリストが表示され、利用できるCLRの一覧が表示されます。今回は、ASP.NET Core アプリケーションを動作させるため、 [マネージド コードなし]の項目をクリックして選択します。設定ができたらダイアログボックスの[OK]ボタンをクリックして ダイアログを閉じます。


アプリケーション プールの画面に戻ると、.Net CLR バージョンの値が "マネージドコードなし" に変わったことが確認できます。

サーバーへの配置:サービスでの実行 (Kestrel Webサーバー)

YARPのリバースプロキシのASP.NET CoreアプリケーションをIISでホスティングせずに、Windowsサービスとして直接実行することもできます。 IISでホスティングする方法に比べパフォーマンスが高くなりますが、IISの機能は利用できなくなります。
このセクションでは、Windows サービスとして実行する方法の設定手順を紹介します。

サービス実行のためのコード修正

Windowsサービスとして実行する場合には、WebApplicationBuilderオブジェクトのHostプロパティのUseWindowsService() メソッドを呼び出す必要があります。
詳しくはこちらの記事を参照してください。
Program.csを以下のコードに変更します。
Program.cs
using Microsoft.Extensions.Hosting.WindowsServices;

var webApplicationOptions = new WebApplicationOptions {
  ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default,
  Args = args,
};

var builder = WebApplication.CreateBuilder(webApplicationOptions);
builder.Host.UseWindowsService();
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();

app.MapReverseProxy();
app.Run();

外部アクセス許可の設定

Windowsサービスとして実行する場合は、Kestrel Webサーバーで実行されるため、Kestrel Webサーバーに外部からアクセスできるよう設定する必要があります。
appsettings.jsonに以下の記述を追加します。
"urls": "http://*:80",

SSLのアクセスを受け付ける場合
SSLのアクセスを受け付ける場合は、SSLのURLの定義と証明書ファイルの設定の必要があります。 設定手順の詳細はこちらの記事を参照してください。

appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",

  /*追加*/
  "urls": "http://*:80",
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}"
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "destination1": {
            "Address": "https://example.com/"
          }
        }
      }
    }
  }
}

サービス作成スクリプトの作成

YARPを実行するサービスを作成するためのスクリプトを作成します。
今回、実行するYARPのプログラムは C:\yarp\ServiceYarpDemo.exe とします。

コマンドプロンプトを利用

コマンドプロンプトでサービスを作成、削除する場合は、以下のバッチファイルを作成します。

サービスを作成するコマンドです。
create-yarpdemo-service.bat
sc create YARPDemo binPath= "C:\yarp\ServiceYarpDemo.exe" start= auto displayname= "YARP Demo Service"

サービスを削除するコマンドです。アンインストール時に利用します。
sc delete YARPDemo

Powershellを利用

サービス実行アカウントの作成
YARPアプリケーションを実行するアカウントを作成します。 アカウント作成手順はこちらの記事または、こちらの記事の記事を参照してください。 また、作成したアカウントをサービスアカウントに設定する必要があります。サービスアカウント設定の手順は こちらの記事を参照してください。

サービスを作成するコマンドを用意します。下記のPowerShellスクリプトを作成して実行します。
create-yarpdemo-service.ps1
$acl = Get-Acl "C:\yarp"
$aclRuleArgs = "(サーバー名)\(サービス実行アカウント名)", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "C:\yarp\ServiceYarpDemo.exe"

New-Service -Name YARPDemo -BinaryPathName "C:\yarp\ServiceYarpDemo.exe" -Credential "(サーバー名)\(サービス実行アカウント名)" -Description "YARP Demo Service" -DisplayName "YARP Demo" -StartupType Automatic

サービスを削除するコマンドです。アンインストール時に利用します。
remove-yarpdemo-service.ps1
Remove-Service -Name YARPDemo 

サービスの作成

コマンドを実行してサービスを作成します。
コマンドを実行すると[サービス]に "YARP Demo Service" サービスが追加されます。


作成された"YARP Demo Service"の項目をクリックして選択し、右クリックします。ポップアップメニューの[開始]の項目をクリックします。


サービスが開始されます。

動作確認

version 2.x の場合

IISのマシンで http://localhost にアクセスします。アクセスすると、example.com のページが表示されます。 リバースプロキシで example.com をプロキシできていることが確認できます。


別のマシンでhttp://(サーバーのIPアドレス) にアクセスします。 こちらも、example.com のページが表示され、リバースプロキシが動作していることが確認できました。


Kestrel Webサーバー で動作する場合の補足
YARPをサービスとして実行した場合も同様の結果になりますが、IISでホストした場合は、IISがファイアウォールで許可されているため、 何も設定をしなくても接続できますが、サービスでKestrel Webサーバーで実行した場合は、ファイアウォールの設定が別途必要です。 ポート番号を指定して開放するか、YARPのプログラムをファイアウォールで許可する設定を追加する必要があります。

version 1.x の場合

IISのマシンで http://localhost にアクセスします。アクセスすると、httpbin.org のページが表示されます。 リバースプロキシで httpbin.org をプロキシできていることが確認できます。


別のマシンでhttp://(サーバーのIPアドレス) にアクセスします。 こちらも、httpbin.org のページが表示され、リバースプロキシが動作していることが確認できました。

次の作業 (YARPの設定)

設定ファイルを編集してYARPの動作を変更します。設定ファイルの記述についてはこちらの記事を参照してください。

ARRとの使い分け

YARPですが、ARR(Application Request Routing)と機能に違いがあるため、利用シナリオによって使い分けが必要です。

アクセス方式の違い

単純なページでは違いが分かりにくいですが、ベーシック認証以外が必要なサイトへのアクセスの場合、動作が違ってきます。
特にWebサイト側で、Windows認証, Negotiate認証, NTLM認証, Kerbereos認証を使用する場合は、YARPでは対応できません。

ホスト名による振り分け

YARPではHostsの設定により、アクセスを受けた際にホスト(FQDN)ごとに参照先の振り分けができます。 一方ARRの場合は、FQDNの判定自体の機能はなく、IISでホスト(FQDN)ごとにサイトを用意し、サイトの振り分け後にURLの書き換えを実行します。 できることに大きな違いはありませんが、設定方法が異なります。サイトの数が多い場合は、IISでサイトを作成する手間が増えてくるため、 YARPのほうが管理しやすいかと思われます。
(ARRでもIPでバインドするサイトを作成し、HTTP_HOSTを条件にURLを書き換えれば、サイトを複数作成せずに、同様の処理は実現できます。)

リクエストヘッダや詳細な条件での振り分け

YARPではリクエストヘッダの内容や詳細な条件での振り分けができます。 ARRの場合は、URLやQUERY_STRING, HTTP_HOST, SERVER_PORT,REQUEST_URI,PATH_INFO を利用した条件設定はできますが、 リクエストデータを判定する条件での振り分けの機能はないです。

負荷分散

YARPでは、Clusters設定で、LoadBalancingPolicy を設定し、Destinations に複数のURLを設定すれば負荷分散が設定できますが、 ARRを利用する場合は、Webファームの機能を利用する必要があります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-03-07
作成日: 2022-07-03
iPentec all rights reserverd.