しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET vNext で用意されている 3 種類のサーバー

ASP.NET vNext はこれまで使われてきた System.Web.dll を捨てた結果、ランタイムとして IIS や ISAPI に依存しなくなりました。その代わり HTTP の処理を実際に行うレイヤーが必要となります。

既に http.sys を利用したものや、Node.js でも使われている libuv ベースのサーバーがリリースされていますので、簡単にまとめておきます。

Servers · aspnet/Home Wiki · GitHub

GitHub Wiki にもサーバーのまとめは上がっているのですが、内容が少し古くなっているので補足も兼ねて。

WebListener

Microsoft.AspNet.Server.WebListener はこれまでもよく使われていた HttpListener と同じようなもので、Windows のカーネルモードドライバである http.sys を直接利用することで、HTTP 周りのオーバーヘッドを出来る限り小さくしています。

残念ながらソースコードは GitHub で公開されていません。

ちなみに BCL にある HttpListener ではなくて、新しく実装された Microsoft.Net.Http.Server というライブラリを使ってサーバーが実装されています。*1

Kestrel

Kestrel は今回、完全に新しく実装されたサーバーです。最初にも軽く触れましたが、Node.js で使われている libuv というクロスプラットフォームな非同期 I/O 処理を実装するためのライブラリを使っています。

https://github.com/aspnet/KestrelHttpServer

libuv を使うことで得られる最大のメリットが Windows に依存しないという点です。libuv 自体がプラットフォーム固有の部分をラップしてくれているので、Kestrel は libuv が提供する TCP 周りの機能を利用して HTTP サーバーを実装しています。

しかし、まだ開発中というのもあり現状は Windows と OS X のみ対応となっています。

Adding linux support by djsell · Pull Request #20 · aspnet/KestrelHttpServer · GitHub

Linux へ対応するための PR も送られていますが、CPU bitness 周りの問題でマージはされていません。*2

IIS (Helios)

Microsoft.AspNet.Server.IIS は既にこのブログでも何回か取り上げましたが、IIS のネイティブ API を利用して System.Web.dll をバイパスし、パフォーマンスを改善するプロジェクトである Helios をベースとして構築されています。

OWIN を加速させる IIS と Helios の関係 - しばやん雑記

ネイティブ API を叩いているので、x86 / x64 それぞれに Interop ライブラリが付いてくるところも、OWIN 用の Helios と変わりません。

IIS を利用している分、直接 http.sys を叩いている WebListener より重いですが、その代わりに既存の IIS モジュールを活用できる点が特徴です。

ASP.NET Hosting

サーバーの紹介が終わったので、ASP.NET vNext アプリケーションはどのように読み込まれて実行されているのか調べました。

簡単に説明してしまうと、ASP.NET vNext アプリケーションを実行しているのは Microsoft.AspNet.Hosting というライブラリになります。

https://github.com/aspnet/Hosting

このホスティングライブラリを使うことで、各サーバーごとに Startup コードを実行する処理を書く必要なく ASP.NET vNext アプリケーションを動かすことが出来るというわけです。

これまで紹介したサーバーとの関係を大雑把な図にしました

f:id:shiba-yan:20141105232144p:plain

WebListener と Kestrel は KLR 上で動かす必要がありますが、IIS からは完全に独立して動く形になります。それに対して IIS (Helios) は IIS のモジュールとして実装されているので、インプロセスで動作します。

このあたりは project.json のコマンド定義からも読み取れます。

    "commands": {
        "WebListener": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5002",
        "Kestrel": "Microsoft.AspNet.Hosting --server Kestrel --server.urls http://localhost:5004",
        "run": "run server.urls=http://localhost:5003"
    },
MusicStore/project.json at master · aspnet/MusicStore · GitHub

Helios が k のサブコマンドに無い理由が理解できました。

まとめ

最後に各サーバーの簡単なまとめだけをしておきます。

  • WebListener
    • IIS に依存しない / http.sys を直接使うので軽量 / プロダクションでどこまで使えるか未知数
  • Kestrel
    • クロスプラットフォーム / Node.js で実績のある libuv を利用 / Linux には現状は未対応
  • IIS (Helios)
    • 既存の Web サーバーと資産を利用可能 / Azure Web サイトでも既に使える / まだ開発中*3

まだ 1.0.0-beta2 なので、これからも RTM に向けて開発が進んでいくことになります。

*1:HttpListener よりもちゃんと http.sys を叩いてる感ある

*2:ちゃんと 32 / 64bit 対応しているように見えるけど、バイナリがおかしい?

*3:落ちる時は一番派手に落ちると思われる