こんにちは、サイオステクノロジーの佐藤 陽です。
これから何本か ASP.NET Core について勉強したことを記事にしていきたいと思います。
なお、まだ自分も勉強中の身であるため
記事の内容に誤りなどありましたら、コメントにて指摘いただけると幸いです。
目次
はじめに
第一弾としては、APS.NET Core のホスティングモデルについて解説していきたいと思います。
ASP.NET Coreのアプリをホスティングする方法は複数提供されており
デプロイする環境や、要件によって適切に選択する必要があります。
今回は、主なホスティング方法をいくつか取り上げ、解説および比較していきたいと思います。
- ASP.NET Core をこれから使っていくよ!
- IISとKestrelって何?
- インプロセスとアウトプロセスって何が違うの?
といった方はぜひ読んでみてください。
ASP.NET Core とは?
ASP.NET Core は、.NET プラットフォームをベースとするフレームワークです。
以前は、ASP.NET のフレームワークが幅広く利用されていました。
ASP.NET Core は、ASP.NET を改良したものになります。
そして ASP.NET Core も年々進化し、現在は LTS リリースとしては ASP.NET Core 8.0 が最新のものになります。
今回の記事は ASP.NET Core 8.0 を対象としたいと思います。
ホスティングモデル
ASP.NET Core は、Web サーバー上でアプリをホストします。
ホスティングの方法として複数の方法が提供されており
今回はその中からいくつかピックアップして紹介したいと思います。
今回紹介するのは以下の 5 つのパターンです。
- Kestrel 単独使用ホスティング
- Kestrel+リバースプロキシ併用ホスティング
- IIS インプロセスホスティング
- IIS アウトプロセスホスティング
- Http.sys ホスティング
それぞれの概要に触れた後、選択する判断基準などを書いていきたいと思います。
Kestrel
KestrelはASP.NET Coreの登場と共に誕生したWebサーバーです。
参考:What is Kestrel Web Server? How It Works, Benefits, and More
主な特徴としては以下のようなものがあります。
- Windows, Linux, macOSで動作するクロスプラットフォーム
- 軽量で高いパフォーマンスを発揮する
まずは Kestrel を Web サーバーとして利用する場合について解説します。
Kestrel 単独使用ホスティング
Kestrel をエッジ Web サーバーとして単体で利用するケースです。
Kestrel は単体でもサーバーとして機能します。
この場合、IIS や HTTP.sys など他の外部 Web サーバーを必要としません。
ただし、同じサーバー上で動作し、同じ IP とポートと共有するアプリケーションが複数ある場合は、リバースプロキシが必須となります。
Kestrel は、リクエストの Host ヘッダーに関係なく、指定されたポートに関してすべてのトラフィックを処理するような仕組みとなっています。
また、一般的にはKestrelを利用する場合はリバースプロキシを併用した方がよいとされています。
その理由も併せ、次の章で仕組みを解説します。
リバースプロキシ併用ホスティング
Kestrel の前段にリバースプロキシを置いて利用するケースです。
Kestrelはシンプルがゆえに非常に高速なのですが、機能としてはやや不足している部分があります。
そのため、Kestrelの前段としてリバースプロキシを配置することが一般的に推奨されています。
リバースプロキシサーバーを利用する主なメリットとしては、以下のことが挙げられます。
- セキュリティの向上
- ロードバランシングの最適化
- TLS/SSL セットアップの単純化
利用されるリバースプロキシサーバーとしては、IIS, Apache, Nginx などが挙げられます。
IIS
次に IIS を Web サーバーとして利用する場合について解説します。
IIS は ASP.NET 時代から使われている Web サーバーで、様々な機能を提供します。
IIS を利用する場合、ASP.NET Core Moduleと呼ばれるモジュールが利用されます。
これは IIS に含まれるものであり、ASP.NET Core アプリケーションと連携を取るためのものです。
また、IIS のホスティングモデルとしては、以下の2つが存在しています。
インプロセスホスティング | IIS のプロセスと同じプロセスとして ASP.NET Core のアプリをホストする場合 |
アウトプロセスホスティング | 外部に立てたIISのサーバーから、別プロセスであるKestrel サーバー上にホストされている ASP.NET Core アプリに Web リクエストを転送する場合 |
インプロセスホスティング
インプロセスホスティングはASP.NET Core 2.2より導入されたホスティングモデルです。
IIS のプロセス(w3wp.exe)と同じプロセスでASP.NET Core のアプリがホストされており、
後述するアウトプロセスホスティングよりも性能が優れているとされています。
なお IISHTTPServer は、インプロセス用に利用される Web サーバーです。
参考:ASP.NET Core In Process Hosting on IIS with ASP.NET Core
余談
ASP.NET自体にもIISでのホスティングは利用されていましたが、
これはASP.NET CoreにおけるIISホスティングとは別モノになります。
詳細はこちらの記事をご覧ください。
アウトプロセスホスティング
インプロセスホスティングとは対比して存在しているのが、アウトプロセスホスティングです。
こちらはASP.NET Core 2.2において、インプロセスホスティングが導入される前まで利用されていました。
IIS とは別プロセスとして ASP.NET Core をホストするサーバー(Kestrel)が立てられます。
うーん、なんだか見たことある図ですね。
実は IIS をリバースプロキシとした場合の Kestrel + リバースプロキシ併用ホスティングと同じ構成です。
なお先ほど述べたように、性能単体で見ればインプロセスホスティングのほうが優れています。
理由としてはIISとKestrel間のネットワーク通信を回避できるためです。
一方で、アウトプロセスホスティングが優れている点もあります。
それは、異なるプラットフォーム上で動くアプリでも 100%の互換性が得られることです。
これは HTTP リクエストを処理するのに利用されるのが IISHTTPServer ではなく、あくまでKestrel であるためです。
ただ、その分性能が落ちてしまうため基本的にはインプロセスホスティングを採用するのがよいとされています。
参考:ASP.NET Core In Process Hosting on IIS with ASP.NET Core
HTTP.sys ホスティング
HTTP.sys は Windows 上のみで動作する ASP.NET Core 用の Web サーバーになります。
主に Kestrel の代用として使われることが多く、以下のような状況で利用が想定されています。
- IIS を使用せず、インターネットに直接サーバーを公開する必要がある
- Kestrel では使用できない機能が要求されている
個人的に、「HTTP.sysを使わなくては実現できない!」といった状況のみ採用するのがよいと感じました。
どのホスティングを選択すればいいの?
⇒アプリを構築したい環境や、要件によります!!
まず、LinuxやmacOSの環境上にアプリをデプロイしたい場合は、Kestrelを利用することになると思います。
ただし、単体での利用はあまり推奨されないため、nginxやApacheなどのリバースプロキシサーバーの利用を検討して下さい。
Windows環境上にデプロイする場合は、IIS のインプロセスホスティングかKestrel+リバースプロキシホスティングを選択するのがいいかと思います。
サーバー単体の性能だけでみるとIISのインプロセスホスティングが優れていますが、
一方でリバースプロキシをKestrelの前に置くことによって様々なメリットを得ることもできます。
一概に「これがベスト!」と言えない部分なため、アプリの要件を踏まえて選択してもらえればと思います。
また、もし Windows環境上でありながら IIS を利用しないというのであれば、Kestrel や Http.sys を検討することになるかと思います。
ざっくりですが、ホスティングを決定するためのフローチャートを作成しました。
繰り返しになりますが、あくまでプロジェクトの状況にも依るかと思うので、チームで慎重に話し合ってみてください。
まとめ
今回はASP.NET Coreをホスティングする場合のパターンを複数見てみました。
それぞれの特徴を理解し、プロジェクトに最適なホスティングを選択してみてください。
ではまた!