IISのhttp2サポートについてちょっとだけ

この記事は[http2 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/http2)の15日目の記事です。

Disclaimer: Windowsの記事です。

# WindowsとHTTP/2

WindowsがHTTP2をサポートすることが明らかになったのは2014年10月でした。[Windows 10とWindows Server 2016のTechnical Previewが公開された時点で、IE11とIISにHTTP2が試験実装されていました](https://blogs.msdn.microsoft.com/ie/2014/10/01/internet-explorer-and-the-windows-10-technical-preview/)。その後、Windows 10は製品版がリリースされましたが、Windows Server 2016はまだリリース日を迎えていません。2015年12月時点の、HTTP/2をサポートするWindowsはこちらです。

* [Windows 10 バージョン1511 (ビルド10586)](https://www.microsoft.com/ja-jp/software-download/windows10) 
* [Windows Server 2016 Technical Preview 4](https://technet.microsoft.com/ja-jp/evalcenter/dn781243.aspx)

# HTTP.sys

実際にはIISがHTTP/2に対応したというより、HTTPカーネルモードドライバ(HTTP.sys)がHTTP/2に対応したというのが正しいです。HTTP.sysについては[説明記事をちょっとだけ書きました](http://qiita.com/matarillo/items/c7ec64ae8e3b9a65f5ea)。独自のサーバーアプリケーションからHTTP.sysを利用するには、HTTP Server APIを呼び出します。HTTP Server APIについてはMSDNの以下のページを起点に見ていくといいでしょう。

* [HTTP Server API](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364510.aspx)
* [HTTP Server API Version 2.0 Reference](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364634.aspx)
  * 例: Server Push用の [`HttpDeclarePush`関数](https://msdn.microsoft.com/en-us/library/windows/desktop/mt219053.aspx)

# Windows 10で試す

IISのHTTP2をWindows 10で試してみたい場合は、以下のようにします。（参考：[David So's Blog - HTTP/2 on IIS](http://blogs.iis.net/davidso/http2) ）

「コントロールパネル」から「Windowsの機能の有効化または無効化」を選び、「インターネット インフォメーション サービス」を有効にします。

![step1](https://iisnetblogs.blob.core.windows.net/media/davidso/Images/HTTP2/iiswalkthrough_1.png)

インストールが完了したら「インターネット インフォメーション サービス(IIS) マネージャ」を起動し、機能ビューで「サーバー証明書」を選びます。

![step2](https://iisnetblogs.blob.core.windows.net/media/davidso/Images/HTTP2/iiswalkthrough_2.png)

操作ウィンドウで「自己署名入り証明書の作成」をクリックします（Let's Encryptなどでもいいのですが手作業が多く発生するので、ここはIISの自己署名証明書でいいでしょう）。

![step3](https://iisnetblogs.blob.core.windows.net/media/davidso/Images/HTTP2/iiswalkthrough_3.png)

「Default Web Site」で「サイトの編集」→「バインド…」をクリックして、新しくTLSバインディングを追加します。証明書には、先ほど作成した自己署名証明書を指定します。

![step4](https://iisnetblogs.blob.core.windows.net/media/davidso/Images/HTTP2/iiswalkthrough_4.png)

この状態で、https://localhost/ にアクセスすれば、HTTP/2が使われます。

# WebアプリケーションのフロントWebサーバーとしてIISを使う

HTTP/2には依存しない話ですが……

クラシックASPやASP.NETを動かす場合の話は省略します。

PHPを動かす場合はFastCGIを使います。（ISAPI拡張＋スレッドセーフPHPの組み合わせはオワコンです。）

* [PHP: Microsoft IIS 7.0 以降 - Manual](http://php.net/manual/ja/install.windows.iis7.php)

それ以外のプラットフォーム(Java, Ruby, Python, Perl, Goなどなど)の場合は、[HttpPlatformHandler](http://www.iis.net/downloads/microsoft/httpplatformhandler)を構成します。

* [HttpPlatformHandler Configuration Reference](http://www.iis.net/learn/extensions/httpplatformhandler/httpplatformhandler-configuration-reference)

# 詳しくは

shibayanが日本語の記事をいくつか書いています（2014年のTechnical Previewの頃から不定期に書かれています）のでそちらも参照するとよいでしょう。

* [Windows Server Technical Preview の IIS というか http.sys が HTTP/2 に対応していたらしい - しばやん雑記](http://blog.shibayan.jp/entry/20141006/1412601973)
* [Windows Server Technical Preview の IIS というか http.sys の HTTP/2 有効 / 無効を切り替える方法 - しばやん雑記](http://blog.shibayan.jp/entry/20141007/1412662459)
* [IIS 10.0 と ASP.NET 4.6 で HTTP/2 のサーバープッシュが使えるようになっていたので試した - しばやん雑記](http://blog.shibayan.jp/entry/20150506/1430846908)
* [Windows Server Technical Preview 2 と ARR 3.0 を組み合わせて HTTP/2 対応のリバースプロキシにしてみた - しばやん雑記](http://blog.shibayan.jp/entry/20150701/1435717724)