【问题标题】:How can I get gzip compression in IIS7 working?如何在 IIS7 中进行 gzip 压缩?
【发布时间】:2010-10-21 15:51:02
【问题描述】:

我已经为 IIS7 安装了静态和动态压缩,并在我的应用程序 Virtual Folder 级别设置了两个 web.config 值。据我了解,我不再需要在服务器或站点级别启用压缩,我可以使用我的 web.config 文件在每个文件夹的基础上进行管理。

我的.config 文件中有两个设置,用于为我的应用自定义gzip:

<httpCompression dynamicCompressionDisableCpuUsage="90"
    dynamicCompressionEnableCpuUsage="0">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
  <dynamicTypes>
    <remove mimeType="*/*"/>
    <add mimeType="*/*" enabled="true" />
  </dynamicTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
    dynamicCompressionBeforeCache="true" />

但是,当我运行应用程序时,我可以清楚地看到没有使用 gzip,因为我的页面大小是相同的。我还在为 FireFox 使用 YSlow,这也证实了我的页面没有被压缩。

我在这里缺少什么?在 IIS6 中,指定文件类型并将压缩级别设置在 0-10 之间很简单。我没有看到需要指定文件类型或压缩级别,因为默认值似乎涵盖了文件类型,而且我在任何地方都没有看到级别。

【问题讨论】:

    标签: asp.net .net-3.5 iis-7 compression gzip


    【解决方案1】:

    遵循 JohnW 的出色建议,我也启用了日志记录以找出罪魁祸首,尽管失败的原因结果不同:

    STATIC_COMPRESSION_NOT_SUCCESS 
    Reason 14 
    Reason NOT_FREQUENTLY_HIT
    

    简而言之,如果您没有足够频繁地点击该页面,那么 IIS7 将不认为它值得压缩,这对我来说似乎有点奇怪。尽管如此,在这种情况下还是有意义的,因为我只是想在本地机器上测试它。

    根据this page,默认似乎是一个页面必须在 10 秒内被点击 2 次才能成为“频繁点击”。如果你真的想要,你可以覆盖 applicationHost.config (%systemroot%\Windows\System32\inetsrv\config) 中的默认值。至少对我来说这是一个锁定的属性,所以你不能在你自己的 web.config 中覆盖它。

    <serverRuntime frequentHitThreshold="1" />
    

    另外,我现在注意到 SO 已经在这里得到了这个答案:In IIS7, gzipped files do not stay that way

    【讨论】:

      【解决方案2】:

      在 Web.config 文件的 system.webServer 部分,添加以下行:

      <remove fileExtension=".js" />  
      <mimeMap fileExtension=".js" mimeType="application/x-javascript" />  
      

      IIS7 中的压缩方案默认启用,但它只映射一个要压缩的 javascript mime 类型,application/x-javascript。添加上面的行告诉 IIS 为您的所有 .js 文件提供 mime 类型,这反过来使压缩工作。

      【讨论】:

      • 我发现情况正好相反——服务器将 JS 发送为 application/x-javascript,但正在压缩 application/javascript
      【解决方案3】:

      对我来说,原来是设置

      noCompressionForProxies
      

      因为我们在这里使用代理...让自己脱离代理,瞧,压缩。

      【讨论】:

        【解决方案4】:

        在 iis 7 测试版期间,forums.iis.net 上有一个关于此的主题。原来这家伙没有安装模块,但听起来你已经从你的开场白中排除了这一点。

        Microsoft 对他的主要建议是启用失败的请求跟踪以找出问题所在。这可能是 IIS7 中最被低估的功能之一,但肯定是最强大的功能之一。

        • 打开 IIS 管理器。
        • 转到您的站点,然后在操作窗格(最右侧)上,单击“配置”部分下的“失败的请求跟踪...”。
        • 单击“启用”。
        • 然后,在功能视图中,单击“失败的请求跟踪规则”。点击添加,下一步,状态码输入200,下一步,点击完成。

        如果您在操作窗格中没有看到“失败的请求跟踪”,则需要将该功能添加到服务器 - 使用“添加角色服务”向导(运行状况和诊断\跟踪)或通过Web 平台安装程序(Products\Server\IIS: Tracing),然后关闭并重新打开 IIS 管理器。

        接下来,重新运行您的测试。这将生成一些日志信息供我们检查。

        查看 c:\inetpub\logs\FailedReqLogFiles\w3svcx。您将看到一堆名为 fr000xx.xml 的文件。在浏览器中打开其中任何一个。 (顺便说一句,如果您将这些文件复制到任何地方,请确保 freb.xsl 在那里。另外,不要删除 freb.xsl - 如果这样做,只需删除整个目录或从另一个位置复制它,因为 IIS 只会创建每个文件夹一次。)

        单击“请求详细信息”选项卡并选择“完整请求跟踪”。在页面中搜索“压缩”——您应该可以在多个区域找到它;一次用于静态内容,一次用于动态内容。

        如果您没有找到其中任何一个,则说明 IIS 配置不正确。如果您确实找到了它们,您应该会看到它们后跟一个compression_success 和一个compression_do。成功是不言自明的; “do”表示它做了什么——在我的例子中,它显示“OriginalSize 1462784 CompressedSize 179482”

        由于您的方法不起作用,希望您能看到一些不同的东西来帮助您解决问题。

        通过在您的网站的操作窗格中禁用失败的请求跟踪,确保在完成后关闭此功能。

        【讨论】:

        • 这有帮助!原来我们的罪魁祸首是 dynamicCompressionDisableCpuUsage - 默认情况下,如果你达到 90%,动态压缩将被禁用并且不会重新启用,直到 CPU 回到默认为 50% 的 dynamicCompressionEnableCpuUsage (!!)
        • 请注意,您需要确保已安装跟踪:iis.net/ConfigReference/system.webServer/tracing/…
        • @JohnW 这在一定程度上有所帮助。通过直接更改 applicationHost.config 中的忽略命中频率,我能够将 STATIC_COMPRESSION_NOT_SUCCESS 更改为 STATIC_COMPRESSION_SUCCESS,但它仍然不会将压缩数据返回到浏览器。我在这里有一个单独的线程:stackoverflow.com/q/38250376/392591
        【解决方案5】:

        我通过在添加/删除程序中安装动态压缩解决了我的问题。

        【讨论】:

          【解决方案6】:

          我们遇到了类似的问题,结果证明 IIS7 在这里做了一些基于动态 CPU 的节流..

          http://www.iis.net/ConfigReference/system.webServer/httpCompression

          dynamicCompressionDisableCpuUsage

          可选的 uint 属性。

          指定禁用动态压缩的 CPU 利用率百分比。

          注意:此属性用作关闭动态压缩的 CPU 上限。当 CPU 利用率低于 dynamicCompressionEnableCpuUsage 属性中指定的值时,将重新启用动态压缩。

          默认值为 90。


          dynamicCompressionEnableCpuUsage

          可选的 uint 属性。

          指定将启用动态压缩的 CPU 利用率百分比。该值必须介于 0 和 100 之间。平均 CPU 利用率每 30 秒计算一次。

          注意:此属性充当 CPU 下限,低于该下限将启用动态压缩。当 CPU 利用率超过 dynamicCompressionDisableCpuUsage 属性中指定的值时,动态压缩将被禁用。

          默认值为 50。

          注意默认值 -- 如果您的 IIS7 达到 90% 的 CPU 使用率,它将禁用所有动态压缩内容,直到 CPU 使用率回落到 50% 以下!

          此外,这里还有一些关于 GZIP 实际 CPU 成本的很好的建议和基准测试。

          http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx

          长话短说,除非您经常拥有超过 200kb 的动态页面,否则这不是问题。

          【讨论】:

            【解决方案7】:

            开启静态压缩。动态压缩适用于asp、php、aspx等动态页面

            这是IIS config reference for compression的链接:

            【讨论】:

            • 我看不出我需要在哪里为 IIS7 执行此操作。我在 IIS6 中看到它,但不是 7。
            • 您可以在 IIS 管理器 (inetmgr) 的 IIS 部分下找到它。打开“压缩”项并选中“启用静态内容压缩”复选框。
            • 添加了指向 IIS 配置参考的链接。
            • 我看到了静态压缩设置,但我并不在乎。我想要对 aspx 页面进行动态压缩,但在文档中找不到需要指定文件类型的位置。
            • 一定是看错了你的问题,抱歉。我虽然你说 CSS 没有被压缩。我不知道您是否可以在 web.config 中执行此操作,但我知道您可以在应用程序中执行此操作。是否为 IIS 启用了动态压缩功能?
            猜你喜欢
            • 1970-01-01
            • 2011-02-12
            • 2012-09-19
            • 2011-02-08
            • 2011-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多