none
静的圧縮で gzip 圧縮を行う方法 RRS feed

  • 質問

  • こんにちは、ダッチです。

    Web サイトで JavaScript や CSS を GZip で圧縮して返したいと思っています。
    圧縮には動的圧縮と静的圧縮というものがあるようで、
    動的圧縮が行われているのは確認できました。

    質問は静的圧縮を行う方法です。

    【環境】
    Microsoft Visual Web Developer 2010 Express
    ASP.NET 4.0
    Web サイト を Razor で作成しています。
    GZip 圧縮の確認には Google Chrome のデベロッパー ツールでヘッダーを見て確認しています。
    テストは手元の PC で行っています。
    最終的には ExpressWeb のレンタルサーバーに適用しようと思っています。

    【試したこと】
    次のサイトを参考にしました。

    HTTP 圧縮 httpCompression
    http://technet.microsoft.com/ja-jp/library/ee431600.aspx
    URL 圧縮 urlCompression
    http://technet.microsoft.com/ja-jp/library/ee431664.aspx

    上記の URL で紹介されいているように Web.config に次の設定を追加しています。

    <system.webServer>
        <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
            <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
            <dynamicTypes>
                <add mimeType="text/*" enabled="true" />
                <add mimeType="message/*" enabled="true" />
                <add mimeType="application/javascript" enabled="true" />
                
                <add mimeType="*/*" enabled="false" />
            </dynamicTypes>
            <staticTypes>
                <add mimeType="text/*" enabled="true" />
                <add mimeType="message/*" enabled="true" />
                <add mimeType="application/javascript" enabled="true" />
                
                <add mimeType="*/*" enabled="false" />
            </staticTypes>
        </httpCompression>
        <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    </system.webServer>

    【問題】
    doDynamicCompression="true" にすると Content-Encoding: gzip の応答が返り、
    実際に JavaScript のサイズも圧縮されているのが確認できます。

    今回やりたいことは静的圧縮なので doDynamicCompression="false" にして、
    doStaticCompression="true" にします。
    すると圧縮されず Content-Encoding もありません。


    【質問】
    静的圧縮を有効にするにはどのようにすればいいのでしょうか?


    【補足】
    Web.config の dynamicTypes と staticTypes に clear 要素を追加して
    <add mimeType="*/*" enabled="true" />
    のようにしてもまったく変化がありませんでした。
    動的圧縮が行われているときでも変化がないので、この設定は見ていない様子です。

    また開発環境に "%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" のフォルダはありませんし、
    "%Windir%\system32\inetsrv" フォルダは空です。gzip.dll はありません。
    にも関わらず、動的圧縮はできています。

    よろしくお願いします。

    ダッチ http://youryella.wankuma.com/

    2013年4月2日 0:38

回答

  • 基本的にはリンク先にあるようにIISマネージャでチェックを付けるだけですが。

    念のため、動的圧縮とは、動的に生成されるコンテンツを動的に圧縮することであり、静的圧縮とは、あらかじめ存在するhtml / css / jsなどのファイルを指定されたディレクトリに圧縮しておき、そのファイルを返すことです。動的に生成されるコンテンツに対して静的圧縮を行うことはできません。
    で、HTTPではブラウザーとWebサーバーとのネゴシエーションで成り立っています。ブラウザーが受け入れる圧縮形式で送信しなければ意味がないです。ですので、設定変更して最初のリクエストでは静的圧縮の場合はまだコンテンツは圧縮されていなかったと思います。何度かアクセスすると圧縮ファイルが用意されそれが返されるようになります。
    (動的圧縮であれば、ブラウザーの要求した圧縮形式でその場で圧縮して返すため、初回アクセスから圧縮されていたと思います。)

    # 静的圧縮の話題はASP.NETと無関係だと思います…。

    • 回答の候補に設定 星 睦美 2013年4月2日 4:47
    • 回答としてマーク ダッチ 2013年4月2日 5:11
    2013年4月2日 1:33

すべての返信

  • 基本的にはリンク先にあるようにIISマネージャでチェックを付けるだけですが。

    念のため、動的圧縮とは、動的に生成されるコンテンツを動的に圧縮することであり、静的圧縮とは、あらかじめ存在するhtml / css / jsなどのファイルを指定されたディレクトリに圧縮しておき、そのファイルを返すことです。動的に生成されるコンテンツに対して静的圧縮を行うことはできません。
    で、HTTPではブラウザーとWebサーバーとのネゴシエーションで成り立っています。ブラウザーが受け入れる圧縮形式で送信しなければ意味がないです。ですので、設定変更して最初のリクエストでは静的圧縮の場合はまだコンテンツは圧縮されていなかったと思います。何度かアクセスすると圧縮ファイルが用意されそれが返されるようになります。
    (動的圧縮であれば、ブラウザーの要求した圧縮形式でその場で圧縮して返すため、初回アクセスから圧縮されていたと思います。)

    # 静的圧縮の話題はASP.NETと無関係だと思います…。

    • 回答の候補に設定 星 睦美 2013年4月2日 4:47
    • 回答としてマーク ダッチ 2013年4月2日 5:11
    2013年4月2日 1:33
  • 回答ありがとうございます。

    ExpressWeb のレンタルサーバーでは IISマネージャをいじれないと思っています。
    ですので、開発環境でもそれを使用しないで Web.config で設定を有効にしたいです。

    > ブラウザーが受け入れる圧縮形式で送信しなければ意味がないです。
    これは Accept-Encoding で gzip が指定されているかということですよね。
    Accept-Encoding: gzip を送信してくるブラウザのみ対応できればいいです。
    それ以外は圧縮されていない生のファイルを返します。

    > ですので、設定変更して最初のリクエストでは静的圧縮の場合はまだコンテンツは圧縮されていなかったと思います。何度かアクセスすると圧縮ファイルが用意されそれが返されるようになります。
    何度かアクセスすると静的圧縮されているのを確認できました。ありがとうございます。
    1, 2 度アクセスしてダメだったので間違っていると思っていました。

    > # 静的圧縮の話題はASP.NETと無関係だと思います…。
    他に適切な場所があるのであれば、教えていただけると幸いです。

    【質問】
    httpCompression の設定は静的圧縮には無関係の設定と考えていいのでしょうか?
    directory のフォルダは存在しないですし、gzip.dll もありません。
    dynamicTypes と staticTypes を全て false にしても圧縮されています。

    > 動的圧縮とは、動的に生成されるコンテンツを動的に圧縮することであり、静的圧縮とは、あらかじめ存在するhtml / css / jsなどのファイルを指定されたディレクトリに圧縮しておき、そのファイルを返すことです。
    動的圧縮を有効にして js が圧縮されるのを確認しました。
    今回、静的圧縮のみ有効にして js が圧縮されるのを確認しました。
    同じ js ファイルでどちらの方法でも圧縮されているため、
    動的に生成されるか、あらかじめ存在しているかの違いで、
    動的圧縮か静的圧縮かを分けているようには見えません。
    動的圧縮と静的圧縮の違いがいまひとつわかりません。

    回答していただいた内容で、静的圧縮されているのは確認できました。
    上記の質問に答えていただけると、より理解を深めることになり助かります。

    新しく質問を作成しろというのであれば、ここまでで解決済みにしたいと思います。



    ダッチ http://youryella.wankuma.com/

    2013年4月2日 2:42
  • フォーラム オペレーターの星 睦美です。
    ダッチ さん、こんにちは

    今回は佐祐理 さんからの回答が参考になると思いますので、私から[回答の候補に設定」させていただきます。

    質問内容のHTTP 圧縮に関してはダッチ さんのほうでもTechNet ライブラリの説明を参照されていますが、
    以下のTechNet ライブラリのページもIIS のHTTP 圧縮の機能を使用する上で参考になると思います。

    IIS 7 で HTTP 圧縮を構成する:

    さらにHTTP 圧縮に関する質問がありましたら、Internet Information Services フォーラムに投稿いただければと思います。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年4月2日 4:48
  • オペレーターさん、ありがとうございます。

    「Internet Information Services フォーラム」で追加の質問をしてみようと思います。

    佐祐理 さん、また回答しようとしてくださったみなさん
    ありがとうございました。


    ダッチ http://youryella.wankuma.com/

    2013年4月2日 5:13