-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPNETCoreWebServer
- 戻る(ASP.NET Core)
ASP.NET Coreの Web サーバ・インフラストラクチャについて説明する。
補足(ASP.NET との構造の違い): ここが
ASP.NET Coreへの移行 で最も理解が要る箇所である。【ASP.NET (System.Web)】 IIS が Web サーバであり、同時にアプリのホストでもある IIS ─(w3wp.exe の中で ASP.NET パイプラインを実行)─ アプリ → IIS 無しには動かない。Windows 専用 【ASP.NET Core】 アプリ自身が HTTP サーバを内蔵する(自己ホスト) Kestrel(アプリ内)で待ち受ける → 単独で動く。IIS / nginx は「前段のリバース プロキシ」 → クロスプラットフォームこの転換により、
dotnet runだけで Web アプリが動く(開発が軽い)- Linux / コンテナで動く
- IIS は必須ではなくなった(使ってもよい)
という現在の姿になっている。
ASP.NET Coreアプリは、
下記のインプロセス HTTP サーバ実装を使用して実行される。
- クロスプラットフォームの HTTP サーバ。
- 非同期 I/O ライブラリである libuvに基づく。
- ASP.NET Coreプロジェクト テンプレートは既定では Kestrel を使用する。
移行メモ(libuv は使われていない/最新化): 「libuv に基づく」は
ASP.NET Core 2.0 頃までの記述である。
版 トランスポート 〜 2.0 libuv(Node.js 由来の C ライブラリ) 2.1 マネージド ソケットが既定に(libuv は選択可) 3.0 以降 libuv のサポートを削除。マネージド ソケットのみ 現在の Kestrel は
System.Net.Socketsベースのマネージド実装であり、
ネイティブ依存が無い。
async/await とSpan<T>/Pipelinesを活用した
実装に置き換わり、性能面でも libuv 版を上回っている。
- HTTPS
- Websocket
- UNIX ドメインソケット
補足(現在サポートされるもの):
機能 対応 HTTP/1.1 ○ HTTP/2 ○(TLS 上。ASP.NET Core 2.2+) HTTP/3(QUIC) ○(.NET 7+。 MsQuicが必要)HTTPS / TLS ○(SNI、証明書の動的選択も可) WebSocket ○ gRPC ○(HTTP/2 が前提) UNIX ドメイン ソケット ○ Named Pipe ○(.NET 8+、Windows) Windows 認証 ×(HTTP.sys / IIS が必要)
- 内部ネットワークにのみ公開される場合、単独で使用。
- 外部公開する場合、IIS、nginx、Apache などのリバース プロキシと併用。
(外部公開する場合、Web サーバのセキュリティ機能が必要になる)
移行メモ(「単独で外部公開してはいけない」は過去の話): 原文の
「外部公開する場合はリバース プロキシと併用」という記述は、
ASP.NET Core 1.x 時代のガイダンスである。現在は Kestrel を直接インターネットに公開してもサポートされる
(Microsoft のドキュメントも 2.0 以降その旨に改訂されている)。ただし、リバース プロキシを置く実務上の理由は今も多い。
理由 内容 1 台で複数アプリを公開 ポート 80/443 を共有し、ホスト名やパスで振り分ける TLS 終端の集約 証明書の管理を 1 箇所に 静的ファイル配信 nginx / CDN の方が速い 負荷分散・ヘルス チェック WAF・レート制限 Windows 認証 Kestrel 単独では不可 逆に、コンテナ + クラウドのロード バランサーという構成では、
Kestrel 単独で十分なことが多い
(Ingress / Application Gateway が前段を担うため)。
-
単独
Startup.Configure メソッド内で、- クライアントの最大接続数、要求本文の最大サイズ、要求本文の最小レートなどを設定
- app.UseKestrel メソッドや、app.Run メソッドにより設定
補足(現在の構成方法/最新化):
UseKestrelを
Configureで呼ぶ形は古い。現在はProgram.csで設定する。var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxConcurrentConnections = 1000; options.Limits.MaxRequestBodySize = 30 * 1024 * 1024; // 30MB options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)); options.ListenAnyIP(5001, listen => listen.UseHttps()); });設定ファイル(
appsettings.json)からも構成できる
(.NET Core config)。{ "Kestrel": { "Endpoints": { "Https": { "Url": "https://*:5001", "Certificate": { "Path": "cert.pfx", "Password": "..." } } }, "Limits": { "MaxRequestBodySize": 31457280 } } }**
MaxRequestBodySize(既定 30MB)**は
ファイル アップロードで最初に踏む制限である
(IIS 併用時は **IIS 側のmaxAllowedContentLength(既定 30MB)**も
別途引き上げる必要がある点に注意)。
-
Windows 専用。
-
下記に基づく。
- HTTP.sys カーネル ドライバ
- HTTP サーバ API
- Windows 認証
- ポート共有
- SNI を使用する HTTPS
- 直接ファイル伝送
- 応答キャッシュ
- WebSocket (Windows 8 以降)
- HTTP/2 over TLS (Windows 10 以降)
-
IIS を使用せず、インターネットに直接サーバを公開するシナリオ
-
Kestrel ではサポートされていないシナリオ
- インターネットに公開する場合。
- その他、HTTP.sys の機能を使用したい場合。
-
HTTP.sys とASP.NET Coreのコードと直結させる。
-
設定は、以下によって行う。
-
Windows Server の構成
- ファイアウォールのポートを開ける。
- HTTP.sys の構成(レジストリ設定)
- HTTP.sys に x.509 証明書を設定する。
- .NET Framework、.NET Coreなどのランタイムをインストール
-
ASP.NET Coreアプリの構成
Startup.Configure メソッド内で、- ・・・などを、
- app.UseHttpSys メソッドや、app.Use メソッドにより設定
-
補足(HTTP.sys を選ぶ理由は 1 つに絞られた): 原文が挙げる用例のうち、
「インターネットに公開する場合」は前述の通り
Kestrel でも可能になったため、現在の選択理由は実質
「Windows 認証(Kerberos / NTLM)を IIS 無しで使いたい」
にほぼ限定される。
Kestrel HTTP.sys プラットフォーム クロスプラットフォーム Windows 専用 Windows 認証 × ○ ポート共有 × ○(同一ポートを複数プロセスで) 応答キャッシュ × ○(カーネル モード) IIS との併用 ○(ANCM 経由) ×(併用不可) 性能 高い 中 構成の容易さ 容易 レジストリ・netsh が要る builder.WebHost.UseHttpSys(options => { options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate; options.Authentication.AllowAnonymous = false; options.UrlPrefixes.Add("https://+:443"); });URL 予約と証明書のバインドが別途必要になる。
netsh http add urlacl url=https://+:443/ user=DOMAIN\User netsh http add sslcert ipport=0.0.0.0:443 certhash=<thumbprint> appid={GUID}
OWIN(Nowin ベースの IServer 実装)に基づいたカスタム サーバを開発可能。
補足: 独自の
IServer実装は現在もサポートされるが、
実務で作ることはほぼ無い。
原文が挙げる Nowin はメンテナンスされていない。
テスト用途であればTestServer(Microsoft.AspNetCore.TestHost)が
標準で用意されており、これがIServerの代表的な別実装である。
-
IIS と Kestrel
リバース プロキシとして IIS または IIS Express を使用 - nginx と Kestrel
リバース プロキシとして nginx を使用 - Apache と Kestrel
リバース プロキシとして Apache を使用
移行メモ(誤記): 原文の「バース プロキシ」は
リバース プロキシの脱字、
「nginx と Kestre」は Kestrel の脱字と判断し修正した。
-
ASP.NET Core モジュール (ANCM) を使用して Kestrel と連携する。
-
ANCM とは、ネイティブの IISモジュールで、
- IISパイプラインにフックして、
- トラフィックをバックエンドにリダイレクトする。
- Kestrel は ANCM からのトラフィックをリッスンする。
-
参考
コチラが参考になる。- ASP.NET Coreのデプロイ - 検証 - IIS
- ASP.NET Core モジュール(≒IISで ASP.NET Coreをホストする)
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/aspnet-core-module
補足(インプロセス/アウトプロセスの 2 方式): 原文が説明しているのは
アウトプロセス ホスティングである。
ASP.NET Core 2.2 以降、インプロセスが追加され、
現在はこちらが既定になっている。【アウトプロセス(〜2.1 の方式)】 ブラウザ → IIS(w3wp.exe) → ANCM → Kestrel(dotnet.exe) → アプリ → プロセスが 2 つ。ループバック HTTP を 1 往復する 【インプロセス(2.2 以降・既定)】 ブラウザ → IIS(w3wp.exe) ─ ANCM ─ IISHttpServer → アプリ → 1 プロセス内で完結。Kestrel は使われない → 性能が大幅に向上(数倍のスループット)<PropertyGroup> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> </PropertyGroup>この違いはデバッグ時のプロセス選択に影響する
(ASP.NET Coreのデプロイ で、
原文が「dotnet.exe ではなく w3wp.exe に戻っている」と
記録しているのは、まさにこの変更のためである)。
コチラを参照。
補足(リバース プロキシ配下で必須の設定): nginx / Apache /
ロード バランサーの配下に置く場合、
転送ヘッダーの処理を有効にしないと不具合が出る。【設定しないと起きること】 ・HttpContext.Connection.RemoteIpAddress が プロキシの IP(127.0.0.1 等)になる → ログ・レート制限が無意味に ・Request.Scheme が http のまま → 生成される URL が http:// になる → OAuth のリダイレクト URI が一致せず認証が失敗する// Program.cs:認証などより「前」に置く app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; # WebSocket proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
KnownProxies/KnownNetworksの既定はループバックのみのため、
別ホストのプロキシを経由する場合は明示的に許可する必要がある
(コンテナ環境で特に踏みやすい)。
・・・
- ASP.NET vNext で用意されている 3 種類のサーバー - しばやん雑記
http://blog.shibayan.jp/entry/20141106/1415200465 - .NET Core で ウェブサーバ Kestrel を使ってウェブアプリを作ってみるテスト - Qiita
https://qiita.com/kent_ocean/items/5f2e791623763a97a9e0
-
ASP.NET Core での Web サーバーの実装
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/servers/-
ASP.NET Core の Kestrel Web サーバー
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/servers/kestrel -
ASP.NET Core での HTTP.sys Web サーバーの実装
https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/servers/httpsys -
ASP.NET Core モジュール(≒IIS で ASP.NET Core をホストする)
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/aspnet-core-module -
Nginx 搭載の Linux で ASP.NET Core をホストする
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/linux-nginx -
Apache 搭載の Linux で ASP.NET Core をホストする
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/linux-apache -
プロキシ サーバーとロード バランサーを使用するように ASP.NET Core を構成する
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/proxy-load-balancer
-
- nginxでASP.NET Coreをホストする
https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx%E3%81%A7ASP.NET%20Core%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B
Tags: 移行, .NET開発, .NET Core, ASP.NET, ASP.NET MVC
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。