如何在IIS7中启用gzip压缩?

70
我已经安装了IIS7的静态和动态压缩功能,并在我的应用程序“虚拟文件夹”级别上设置了两个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,它也确认我的页面没有进行gzip压缩。

我错过了什么?在IIS6中,只需指定文件类型,并将压缩级别设置为0-10就可以了。我没有看到需要记录文件类型或压缩级别的文档,因为默认值似乎涵盖了文件类型,而我没有看到任何级别。

7个回答

65

在iis 7 beta期间,forums.iis.net上有一个关于这个问题的帖子。结果发现那个人没有安装模块,但从你的开头句子来看,你已经排除了这个原因。

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

  • 打开IIS Manager。
  • 转到您的站点,在操作面板(极右侧),单击“配置”下的“Failed Request Tracing...”。
  • 点击“启用”。
  • 然后,在特征视图中,点击“Failed request tracing rules”。单击添加,下一步,输入状态代码200,下一步,单击完成。

如果您在操作面板中没有看到“Failed Request Tracing”,则需要向服务器添加此功能-可以使用“添加角色服务”向导(Health and Diagnostics\Tracing)或通过Web Platform Installer(Products\Server\IIS: Tracing)进行添加,然后关闭并重新打开IIS Manager。

接下来重新运行测试。这将为我们生成一些日志信息。

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

单击“请求详细信息”选项卡,选择“完成请求跟踪”。搜索页面中的“compress”-你应该会在几个区域中找到; 一次用于静态内容,一次用于动态内容。

如果你没有找到它们中的任何一个,那么 IIS 配置不正确。如果你找到了它们,你应该看到紧随其后的是 compression_success 和 compression_do。成功是不言自明的;'do' 表示它所做的事情 - 在我的情况下,它显示了“OriginalSize 1462784 CompressedSize 179482”。

由于你的不起作用,希望你能看到一些有助于解决问题的不同信息。

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


14
有帮助!结果发现我们的罪魁祸首是 "dynamicCompressionDisableCpuUsage" -- 默认情况下,如果您达到90%,动态压缩将被禁用,并且直到CPU降回到默认为50%的 "dynamicCompressionEnableCpuUsage" 才会重新启用。 - Jeff Atwood
4
请注意,您需要确保已安装跟踪功能:http://www.iis.net/ConfigReference/system.webServer/tracing/traceFailedRequests - mhenry1384
@JohnW 这在一定程度上有所帮助。我通过直接更改applicationHost.config中的Ignore Hit Frequency,将STATIC_COMPRESSION_NOT_SUCCESS更改为STATIC_COMPRESSION_SUCCESS,但仍无法将压缩数据返回给浏览器。我在这里开了一个单独的线程:https://dev59.com/bFoT5IYBdhLWcg3wtRUR - Jacques

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 的 CPU 使用率达到 90%,它将禁用所有动态压缩内容,直到 CPU 使用率下降至 50% 以下!
此外,此处提供了一些有关GZIP实际 CPU 成本的建议和基准测试。 http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx 长话短说,除非您定期使用超过 200kb 的动态页面,否则这不是问题。

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中,压缩文件无法保持原样


5

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


5
在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 - Zhaph - Ben Duguid

3

我不认为在IIS7中需要这样做。我在IIS6中看到了,但是在7中没有。 - Russ
1
您可以在IIS管理器(inetmgr)中的IIS部分找到它。打开“压缩”项目并选中“启用静态内容压缩”复选框。 - Darren Kopp
添加了到IIS配置参考的链接。 - Darren Kopp
我看到了静态压缩设置,但我并不在意。我想要针对aspx页面的动态压缩,在文档中却找不到需要指定文件类型的地方。 - Russ
抱歉,我可能误解了你的问题。我以为你说CSS没有被压缩。我不知道是否可以在web.config中实现,但我知道可以在应用程序中实现。你是否已启用IIS的动态压缩功能? - Darren Kopp
我已经在网站上启用了它,但我也尝试将其设置为IIS的根目录,但没有成功。 - Russ

0

对我来说,问题竟然是设置

noCompressionForProxies

因为我们在代理上...我把自己从代理中移除,然后就有了压缩。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接