以前に bzip2 の圧縮を行うモジュールを IIS に向けに作ったので、何となく Brotli で圧縮するモジュールも作ってみました。ちなみに Brotli は Google が開発した新しい圧縮形式です。
IIS は圧縮形式をネイティブな DLL で拡張可能に作られているので、Brotli を IIS 向けに実装すればこれまでの gzip と同じように使えるようになります。
インターフェースなどに関しては、bzip2 を実装したときの記事を参照してください。
作成したライブラリのソースコードは GitHub に公開しておきました。Brotli のコードは含んでいないので、いい感じにリンクするなりしないとビルドは出来ないはずです。
ビルドした DLL を IIS 側に登録する必要がありますが、最近は IIS Manager から簡単にスキームを追加できるので簡単です。むしろ DLL のパーミッションのがはまりやすいです。
applicationHost.config を直接弄る場合には、以下のような書き方になります。
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> <scheme name="br" dll="C:\inetpub\brotli.dll" /> <staticTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/javascript" enabled="true" /> <add mimeType="application/atom+xml" enabled="true" /> <add mimeType="application/xaml+xml" enabled="true" /> <add mimeType="image/svg+xml" enabled="true" /> <add mimeType="*/*" enabled="false" /> </staticTypes> <dynamicTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="application/javascript" enabled="true" /> <add mimeType="*/*" enabled="false" /> </dynamicTypes> </httpCompression>
実は scheme を複数書くことができるので、gzip を残したまま Brotli を有効化することが出来ます。基本的に gzip しか用意されていないので、全く気が付きませんでした。
とりあえず、IIS 側で Brotli を有効にしない状態で試してみます。
Content-Encoding が返ってきていないので、圧縮が全く行われていないことが分かります。
Chrome 49 は about:flags から Brotli を有効に出来るので、有効にした状態で試しました。そして HTTPS じゃないと使ってくれないみたいなので、IIS 側で HTTPS を有効にしておく必要があります。
今度は Content-Encoding が br になって、Content-Length のサイズが減っていることが確認できました。ちゃんと Brotli での圧縮が行われています。
最初に試したデフォルトの iisstart.htm はサイズが小さすぎたので、今度は大きめのファイルで試してみました。圧縮前のサイズで 340KB ほどあります。
Brotli では 28KB まで圧縮されました。折角なので gzip でも試してみます。
gzip の場合は 45KB になりました。Brotli の方が圧縮率が高いことが確認できました。余力があればバイナリをインストーラーで配布できるようにもしたいですが、WiX がかなりめんどくさいです。