IIS 7.5 上的 GZip 压缩不起作用

Posted

技术标签:

【中文标题】IIS 7.5 上的 GZip 压缩不起作用【英文标题】:GZip Compression On IIS 7.5 is not working 【发布时间】:2011-10-19 19:17:24 【问题描述】:

我正在尝试在 IIS 下为我的静态文件支持 GZip 压缩(默认情况下应启用但未启用),但目前无法正常工作。这是Web应用程序的web.config文件中<system.webServer>节点下的部分;

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" />
  <dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </dynamicTypes>
  <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="application/atom+xml" enabled="true" />
    <add mimeType="application/xaml+xml" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </staticTypes>
</httpCompression>

<urlCompression doStaticCompression="true" />

我用谷歌浏览器试过了。这是请求标头;

接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3

接受编码:gzip、deflate、sdch

Accept-Language:en-US,en;q=0.8

缓存控制:无缓存

连接:保持活动状态

主机:我的网站网址

Pragma:no-cache

用户代理:Mozilla/5.0 (Windows NT 6.0) AppleWebKit/534.30 (KHTML, 像壁虎)Chrome/12.0.742.122 Safari/534.30

这些是响应标头;

接受范围:字节

内容长度:232651

内容类型:应用程序/x-javascript

日期:格林威治标准时间 2011 年 8 月 4 日星期四 08:58:19

ETag:"a69135734a50cc1:0"

最后修改时间:格林威治标准时间 2011 年 8 月 1 日星期一 12:56:37

服务器:Microsoft-IIS/7.5

X-Powered-By:ASP.NET

我检查了 applicationHost.config 文件,发现一些节点如下所示;

----

<section name="httpCompression" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />

----

<section name="urlCompression" overrideModeDefault="Allow" />

----

<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/x-javascript" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>

----

<urlCompression />

我在这里错过了什么?

【问题讨论】:

我应该在serverfault.com问这个问题吗? 我遇到了同样的问题。根据 Wireshark 的说法,无论我做什么,它都不会压缩任何东西。 你得到@Brain2000 答案的最终解决方案了吗? 【参考方案1】:

经过大量搜索,我终于找到了在我的 IIS 7.5 上进行压缩的原因。 首先,IIS 不会压缩文件,除非它加载得足够频繁。这就引出了一个问题“IIS 经常考虑什么?”嗯,默认值是每 10 秒 2 次。哎呀!

此设置可以在 web.config 中更改,但需要先在 applicationHost.config 中解锁该部分。以下是命令:

先解锁部分:

C:\Windows\System32\inetsrv\appcmd.exe 解锁配置 /section:system.webServer/serverRuntime

在配置路径“MACHINE/WEBROOT/APPHOST”中解锁部分“system.webServer/serverRuntime”。

现在已经完成,编辑 web.config 文件并添加 serverRuntime 元素:

...

在这种情况下,我将其设置为每 10 小时点击一次文件。您可以根据需要调整这些值。这是解释 serverRuntime 元素的文档:

http://www.iis.net/configreference/system.webserver/serverruntime

我希望这也有助于您的压缩工作。

注意:您也可以在 applicationHost.config 文件中设置 serverRuntime 元素,但我选择在 web.config 中更改它,因为我们有许多服务器和具有各种站点的场,而且它是我更容易从这个粒度级别控制它。

【讨论】:

事实证明,您可以使用此参数完全避免“频繁请求”问题:httpCompression 下的 staticCompressionIgnoreHitFrequency。设置为 True。 @ianbeks 这在所有操作系统下都可用吗?还是更新一些,比如 2012R2? 我认为它不受操作系统限制,但可能受 IIS 版本限制。 www.iis.net 网站在他们的文档中至少有 iis7,我可以在我的 Win 8.1 开发机器上看到它。 iis.net/configreference/system.webserver/httpcompression ...上面的链接指出:在 IIS 8.5 中添加了 staticCompressionIgnoreHitFrequency 属性。 如果您决定在 x64 位 Windows 上通过 Notepad++ 或任何其他 32 位编辑器编辑 %windir%\System32\inetsrv\config\applicationHost.config,您可能需要使用其他路径,请参阅:forums.iis.net/t/1151982.aspx【参考方案2】:

要记住的一点是,第一次命中通常会立即以未压缩的形式返回,但会启动一个线程在后台压缩文件,以便为将来的请求提供压缩响应。

另外,您是否尝试过使用其他客户端(例如 IE)?

【讨论】:

哇,先生,很高兴得到您的答复 :) 是的,尝试了不同的事情,但根本没有机会。也试过 fiddler :) 认为这可能是“%SystemDrive%\inetpub\temp\IIS 临时压缩文件”文件夹的权限问题,但也无法解决。我是否需要在 iis 上为我的网络应用程序的所有用户设置权限?因为我正在运行近 20 个应用程序,每个应用程序在服务器上都有自己的用户帐户。 “IIS 临时压缩文件”文件夹具有 IIS_IUSRS 用户完全控制权限。缺少什么我真的很想知道。 我怎样才能获得此操作的失败请求跟踪以查看实际错误? 从技术上讲,压缩只会发生在“经常请求”的内容上,这些内容是在 system.webServer / serverRuntime 元素下使用frequentHitThreshold and frequentHitTimePeriod attributes 定义的。查看更多here。 我遇到了同样的问题,所以我同时在 Firefox、Chrome 和 IE 中打开了浏览器窗口。多次点击同一页面后,内容被编码回来。以前,我每次都是 Shift + F5 刷新页面,这是获取未压缩的内容(您提到的第一个未压缩版本)。在您发表评论之前,我真的很挠头,所以谢谢。微软最好能更清楚地解释这种行为。 事实证明,您可以使用此参数完全避免“频繁请求”问题:httpCompression 下的 staticCompressionIgnoreHitFrequency。设置为 True。【参考方案3】:

确保在服务器上安装动态压缩。在 IIS 下添加/删除功能。

【讨论】:

我不敢相信,如果需要启用动态压缩,为什么要选择静态压缩?但这就是解决办法。【参考方案4】:

我也花了一段时间才弄清楚这一点。将 applicationHost.config 文件中 system.webServer/serverRuntime 节点上的频繁HitThreshold 属性设置为 1 应该可以解决问题,如 http://www.iis.net/ConfigReference/system.webServer/serverRuntime 中所述。

您可以通过以管理员身份执行以下命令来做到这一点:

%windir%\system32\inetsrv\appcmd set config /section:serverRuntime /frequentHitThreshold:1 /commit:apphost

一个警告 - “频繁命中”的概念似乎并不特定于压缩。不知道这样设置会不会有其他后果!

【讨论】:

这给了我Unknown attribute "frequentHitThreshold" 我觉得你真正想要的设置是&lt;httpCompression staticCompressionIgnoreHitFrequency="true" /&gt;【参考方案5】:

“system.webServer 配置不允许在网站级别进行 httpCompression” https://serverfault.com/questions/125139/iis7-dynamic-compression-not-success-reason-12

为什么要使用配置文件?试着用一些超过 2700 字节的 txt 文件创建新的虚拟网站。您也可以尝试安装动态压缩模块并为服务器 ant 这个虚拟站点打开它。

【讨论】:

我想你的意思是不能在Web.config中定义httpCompression。但是,它确实属于 applicationHost.config 文件中的 system.webServer 下。 所以每个站点的 applicationHost.config 文件中都有一个位置节点。我需要从那里配置它吗?另外我需要说的是,在开发阶段,压缩在 iis express 下工作正常。 我没有尝试动态压缩。实际上我也没有安装它。仅启用静态压缩。老实说,应该是但不是。 好的。您可以尝试跟踪您的错误 zip 请求。检查此forums.iis.net/t/1162238.aspx#1922938。同样首先,请检查“temp”文件夹的访问权限。看到这个forums.iis.net/t/1172925.aspx【参考方案6】:

我们发现的一件事是,由于正在运行高资源 WebJob,我们的 Azure 网站正在达到其最大 CPU 使用率。我们已经尝试了上述所有设置,但没有任何效果。然后我们检查了资源 CPU 使用率,发现它是 80%+。当 CPU 负载达到 80% 时,gzip 停止工作!

【讨论】:

以上是关于IIS 7.5 上的 GZip 压缩不起作用的主要内容,如果未能解决你的问题,请参考以下文章

即使在 applicationHost.config 中允许,gzip 压缩也不起作用

Gzip 压缩在 Elastic Beanstalk 上的 docker 中不起作用?

gzip 压缩 & iis express/iis?

IOS 的 C# PushSharp 通知在 IIS 7.5 中不起作用

iis 7.5 dns windows身份验证页面用户身份不起作用

通过.htaccess的Gzip压缩不起作用