如何在IIS7中运行gzip压缩?

时间:2009-04-24 16:34:32

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

我已经为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,因为我的页面大小是相同的。我也在使用YSlow用于FireFox,这也证实了我的网页没有被gziped。

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

7 个答案:

答案 0 :(得分:62)

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

微软对他的主要建议是启用失败的请求跟踪以找出问题所在。这可能是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”

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

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

答案 1 :(得分:27)

我们遇到了类似的问题,结果发现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使用率,它将禁用所有动态gzip压缩内容,直到CPU使用率回落到50%以下!

此外,还有一些关于GZIP实际CPU成本的重要建议和基准。

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

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

答案 2 :(得分:21)

根据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

答案 3 :(得分:5)

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

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

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

答案 4 :(得分:5)

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

答案 5 :(得分:3)

打开静态压缩。动态压缩适用于动态页面,如asp,php,aspx等。

以下是IIS config reference for compression的链接:

答案 6 :(得分:0)

对我而言,结果是

noCompressionForProxies

因为我们在这里代理......把自己从代理中解脱出来,瞧瞧,压缩。