为什么在IIS 8.5上gzip压缩不起作用?

7
我无法在Server 2012 R2机器上的IIS 8.5上实现gzip压缩。我进行了一些研究,并按照以下帖子中的说明进行了操作:
  1. 如何在IIS 7.5中启用GZIP压缩
  2. IIS 8.5中的压缩未成功,指出ALREADY_CONTENT_ENCODING
  3. IIS 7.5上的GZip压缩不起作用
  4. IIS 8.5上的gzip压缩不起作用
这是我的配置文件的相关部分:
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" staticCompressionIgnoreHitFrequency="true">
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
    <!-- I have read that dynamic compression increases server CPU load.
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    -->
    <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true" />

此外,在IIS中,我将压缩设置为适用于大于256字节的任何内容。我已执行iisreset。 然而,我在Chrome或IE的开发控制台中没有看到压缩,并且PageSpeed仍然告诉我要压缩一些内容。我错过了什么简单的步骤?
4个回答

4

如果你已经正确配置了所有的IIS设置,但仍然难以理解发生了什么事情。

  • 为了检查压缩是否正常工作,你是如何访问网站的。例如,如果你使用FQDN www.example.com,请尝试使用localhost url。这将确保你的IIS设置正确。
  • 如果localhost正常工作而你的完全限定域名不起作用,则问题可能出在网络中。为了使压缩工作,浏览器需要发送请求头accept-encoding:gzip, deflate。很多时候,你的代理或负载均衡器可能会截断这个头文件,导致这个头文件无法到达IIS服务器。所以即使所有的设置都正确,IIS也不会进行压缩。

为了验证请求的情况以及为什么IIS没有压缩请求,你可以执行以下操作。

  • 确保您已安装失败请求跟踪
  • 配置您的失败请求定义
    • 进入失败请求跟踪模块
    • 在侧边栏上点击添加Failed Request tracing
    • 启用所有内容和状态为200-999
    • 完成配置。
    • 现在复制问题,您将在目录C:\inetpub\logs\FailedReqLogFiles\W3SVC中捕获到跟踪。
    • 在IE中打开跟踪文件(每个请求都会生成一个文件),确保请求详细信息与要验证的请求匹配,并转到紧凑视图Failed Request tracing Compact View
    • 搜索压缩并检查原因Dynamic Compression failed Reason

我尝试了一下,发现应该被压缩的文件之一,并且我看到 STATIC_COMPRESSION_NOT_SUCCESS 的详细信息是“Reason =”NOT_FREQUENTLY_HIT“”。这是否应该被避免,因为我在我的配置中设置了 staticCompressionIgnoreHitFrequency - mrcoulson
frequentHitThreshold是一个适用于静态压缩规则的限制。是的,您可以将staticCompressionIgnoreHitFrequency设置为始终进行压缩。 - Rohith
好的,我已经做过了,但是我发现它没有压缩。有什么东西可以覆盖它吗? - mrcoulson
尝试将frequentHitThreshold设置为零并进行验证。staticCompressionIgnoreHitFrequency应该处理压缩。另外,压缩还有一个最小文件大小。因此,您正在测试的文件应该超过最小文件大小。在所有这些都验证过之后,失败的请求跟踪压缩原因是什么? - Rohith

1
正如OP链接中的答案所提到的,一定要检查服务器上是否运行了任何反病毒软件。在我的情况下,是ESET。在相关的ESET设置被禁用之前,没有任何IIS压缩设置生效。
我省略了设置的细节-我做了一个似乎相当全面的禁用,并让IT去找出哪个确切的设置在保持安全性的同时仍然可以工作。

0

我曾经遇到过类似的问题,是由于ESET产生了一些奇怪的行为。 在某些机器上可以正常工作,但是在安装eset的机器上却不能。花了我一些时间才意识到这一点。

出问题的原因是ESET导致chrome将http2请求降级到http 1.1并且不压缩它们。可以通过打开network并启用'protocol'列来查看。之后卸载eset后,即使我强制chrome使用'--disable-http2'标志使用http1.1,它仍然可以工作。

无论如何,如果还没有解决问题,我会尝试(除了其他答案之外):

  • 检查是否有不同的客户端表现相同(在我的情况下,只有开发机有问题)
  • 部署一个简单的静态网站(甚至是默认的网站)进行测试
  • 重新安装iis
  • 检查iss服务器管理器、配置编辑器/ system.webServer/httpCompression集合中的设置,更改压缩级别

0

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