しばやん雑記

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

IIS 向けに Brotli を実装した HTTP 圧縮モジュールを作ってみた

以前に 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 がかなりめんどくさいです。