70

我已经为 IIS7 安装了静态和动态压缩,并web.config在我的应用程序Virtual Folder级别设置了这两个值。据我了解,我不再需要在服务器或站点级别启用压缩,我可以使用我的 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 之间很简单。我没有看到需要指定文件类型或压缩级别,因为默认值似乎涵盖了文件类型,而且我在任何地方都没有看到级别。

4

7 回答 7

64

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

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

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

如果在操作窗格中没有看到“Failed Request Tracing”,则需要将该功能添加到服务器 - 使用“添加角色服务”向导(Health and Diagnostics\Tracing)或通过 Web 平台安装程序(产品\服务器\IIS:跟踪),然后关闭并重新打开 IIS 管理器。

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

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

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

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

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

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

于 2009-04-24T19:34:47.897 回答
28

我们遇到了类似的问题,事实证明 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 的动态页面,否则这不是问题。

于 2009-07-07T17:24:04.750 回答
21

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

STATIC_COMPRESSION_NOT_SUCCESS 
Reason 14 
Reason NOT_FREQUENTLY_HIT

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

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

<serverRuntime frequentHitThreshold="1" />

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

于 2010-10-16T14:13:40.690 回答
5

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

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

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

于 2009-05-05T13:15:16.830 回答
5

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

于 2010-03-01T02:38:25.743 回答
3

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

这是压缩的 IIS 配置参考的链接:

于 2009-04-24T16:35:38.140 回答
0

对我来说,它原来是设置

noCompressionForProxies

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

于 2013-01-23T00:20:18.770 回答