[英]Gzip compression doesn't work in IIS7.5 for classic application pool
我试图弄清楚为什么使用经典应用程序池的一个站点不会被压缩。 此应用程序池已启用32位。 我在applicationHost.config中有以下设置。
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" dynamicCompressionLevel="4" staticCompressionLevel="9"/>
<scheme name="deflate" dll="%Windir%\system32\inetsrv\gzip.dll" dynamicCompressionLevel="4" staticCompressionLevel="9"/>
<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>
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
</httpCompression>
并在global.asax文件Sub Application_PreRequestHandlerExecute(ByVal sender As Object,ByVal e As EventArgs)
Dim app As HttpApplication = TryCast(sender, HttpApplication)
Dim acceptEncoding As String = app.Request.Headers("Accept-Encoding")
Dim prevUncompressedStream As Stream = app.Response.Filter
If app.Context.CurrentHandler Is Nothing Then
Return
End If
If Not (TypeOf app.Context.CurrentHandler Is System.Web.UI.Page) OrElse app.Context.CurrentHandler.[GetType]().Name = "SyncSessionlessHandler" OrElse app.Request("HTTP_X_MICROSOFTAJAX") IsNot Nothing Then
Return
End If
If acceptEncoding Is Nothing OrElse acceptEncoding.Length = 0 Then
Return
End If
acceptEncoding = acceptEncoding.ToLower()
If acceptEncoding.Contains("gzip") Then
' gzip
app.Response.Filter = New GZipStream(prevUncompressedStream, CompressionMode.Compress)
app.Response.AppendHeader("Content-Encoding", "gzip")
ElseIf acceptEncoding.Contains("deflate") OrElse acceptEncoding = "*" Then
' deflate
app.Response.Filter = New DeflateStream(prevUncompressedStream, CompressionMode.Compress)
app.Response.AppendHeader("Content-Encoding", "deflate")
End If
End Sub
我加倍检查我是否安装了dynamicCompression功能。 在最终输出中,Content-Encoding标头一直被删除。 我还应该看看什么? 我读到一些函数不适用于经典应用程序池。 这会导致问题吗?
IIS 7显着改进了内部压缩功能,使其比以前的版本更容易利用内置于Web服务器的压缩。 IIS 7还支持动态压缩,允许自动压缩在您自己的应用程序(ASP.NET或其他!)中创建的内容。 该方案基于内容类型嗅探,因此它适用于任何类型的Web应用程序框架。
虽然对于大多数文本内容( text/*
,包括HTML和CSS,以及JavaScript,Atom,XAML,XML),IIS 7上的静态压缩非常容易设置和打开,但设置动态压缩是更多涉及,主要是因为各种默认压缩设置在IIS - > ASP.NET层次结构中的多个位置设置。
我们来看看两种方法中的每种方法:
IIS 7.x中的压缩在<system.WebServer>
空间中配置了两个.config
文件元素。 可以在IIS / ASP.NET配置管道中的任何位置设置元素,从ApplicationHost.config一直到本地web.config文件。 以下是来自IIS 7.5上的ApplicationHost.config(在%windir%\\System32\\inetsrv\\config
文件夹中)的默认设置,并进行了一些小的调整(添加了json输出并启用了动态压缩):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<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" doDynamicCompression="true" />
</system.webServer>
</configuration>
您可以在此处找到关于密钥的文档:
httpCompression
元素 - 什么以及如何压缩 基本上, httpCompression
配置要压缩的类型以及如何压缩它们。 它指定处理gzip编码的DLL以及要压缩的文档类型。 类型是基于mime类型设置的,它们查看HTTP响应中返回的Content-Type标头。 例如,我将mime类型的application / json添加到上面的动态压缩类型中,以允许压缩内容,因为我有相当多的AJAX内容被发送到客户端。
urlCompression
元素 - 启用和禁用压缩 urlCompression
元素是打开和关闭压缩的快速方法。 默认情况下,服务器范围内启用静态压缩,并在服务器范围内禁用动态压缩。 这可能有点令人困惑,因为httpCompression
元素还具有doDynamicCompression
属性,默认情况下该属性设置为true,但同名的urlCompression
属性实际上覆盖了它。
urlCompression
元素只有三个属性: doStaticCompression
, doDynamicCompression
和dynamicCompressionBeforeCache
。 doCompression
属性是否是启用压缩的最终决定因素,因此最好是explcit! doDynamicCompression='false”
的默认doDynamicCompression='false”
,但是doStaticCompression="true"
! 默认情况下启用静态压缩,而不启用动态压缩
由于静态压缩在IIS 7中非常有效,因此默认情况下在服务器范围内启用静态压缩,因此可能没有理由更改该设置。 然而,动态压缩由于资源密集程度较高,因此默认情况下处于关闭状态。 如果要启用动态压缩,则必须处理一些怪癖,即在ApplicationHost.config中启用它不起作用。 设置:
<urlCompression doDynamicCompression="true" />
在applicationhost.config中似乎没有任何效果,我不得不将此元素移动到我的本地web.config中以使动态压缩工作。 这实际上是一个明智的选择,因为您不太可能希望在服务器上的每个应用程序中进行动态压缩。 相反,动态压缩应该在有意义的地方有选择地应用。 但是,无法记录applicationhost.config中的设置不起作用(或者更有可能在某处覆盖并在配置层次结构中禁用更低)。
所以: 记得在web.config中设置doDynamicCompression=”true”
!
静态压缩适用于从磁盘上的文件加载的静态内容。 因为这个内容是静态的并且不会经常更改 - 例如.js
, .css
和静态HTML内容 - 所以IIS很容易压缩然后缓存压缩内容。 这种方式的工作方式是IIS将文件压缩到服务器硬盘上的特殊文件夹中,然后如果已请求压缩内容并且基础文件资源未更改,则从该位置读取内容。 提供已经压缩的文件的语义非常有效 - IIS仍然会检查文件更改,但是只是从压缩文件夹中提供已经压缩的文件。
压缩文件夹位于:
%windir%\\inetpub\\temp\\IIS Temporary Compressed Files\\ApplicationPool\\
如果查看子文件夹,您将找到压缩文件:
CompressedFileFolder
这些文件是预先压缩的,IIS直接将它们提供给客户端,直到更改基础文件。
正如我之前提到的 - 默认情况下静态压缩是打开的,并且没有理由关闭该功能,因为它是有效的并且只是开箱即用。 您可能想要做的一个调整是将压缩级别设置为最大值。 由于IIS仅很少压缩内容,因此应用最大压缩是有意义的。 您可以使用scheme元素上的staticCompressionLevel设置执行此操作:
<scheme name="gzip" dll="%Windir%\\system32\\inetsrv\\gzip.dll" staticCompressionLevel="9" />
除此之外,默认设置可能还不错。
默认情况下,动态压缩被禁用,这实际上非常合理 - 您应该非常小心地使用动态压缩,并考虑要压缩的内容。 在大多数应用程序中,压缩所有生成的内容是没有意义的,因为它会产生大量的开销。 Scott Fortsyth有一篇很棒的文章,详细介绍了一些性能数字以及动态压缩的影响程度。 根据服务器的繁忙程度,您可以使用压缩功能,看看它对服务器性能的影响。
您还可以调整一些设置,以最大限度地减少动态压缩的开销。 具体来说,httpCompression键有几个与CPU相关的键,可以帮助最小化动态压缩对繁忙服务器的影响:
dynamicCompressionDisableCpuUsage
dynamicCompressionEnableCpuUsage
默认情况下,它们设置为90
和50
,这意味着当CPU达到90%时,压缩将被禁用,直到CPU利用率下降到50%。 同样,这实际上是非常明智的,因为它在可用时利用来自压缩的CPU功率,并且在达到阈值时下降。 在利用率较低时,大型服务器上的一些额外CPU功率是一种很好的方式。 这些设置也是你可能需要玩的东西。 我可能会将上限设置为略低于90%,可能约为70%,这使得这项功能只有在有足够的电量时才能启动。 我不确定IIS使用的这些CPU读数有多精确,因为即使在低负载期间,Web服务器上的CPU使用率也会急剧上升。 不要信任设置 - 在实时环境中进行一些负载测试或监控服务器,以查看哪些值对您的环境有意义。
最后,对于动态压缩,我倾向于为JSON数据添加一个Mime类型,因为我的很多应用程序通过线路发送大块JSON数据。 您可以使用application / json内容类型执行此操作:
<add mimeType="application/json" enabled="true" />
默认压缩是GZip。 该文档提示您可以使用不同的压缩方案,并提及Deflate压缩。 当然,您可以将压缩设置更改为:
<scheme name="deflate" dll="%Windir%\\system32\\inetsrv\\gzip.dll" staticCompressionLevel="9" />
获得deflate样式压缩。 deflate算法产生稍微更紧凑的输出,所以我倾向于优先于GZip,但是更多HTTP客户端(除了浏览器)支持GZip而不是Deflate,因此如果构建Web API,请小心使用此选项。
我也有一些问题,上面的值实际上正在应用。 在applicationhost.config中更改方案并没有立即显示在该站点上。 它要求我做一个完整的IISReset,以便在我看到更改以缩小压缩内容之前显示该更改。 内容稍微压缩一点 - 不确定它是否值得稍微不那么常见的压缩类型,但至少可以选择。
总之,IIS 7最终使GZip变得简单,即使配置设置有点迟钝且文档严重缺乏。 但是一旦你知道我在这里描述的基本设置以及你可以在本地web.config中覆盖所有这些的事实,就可以直接配置GZip支持并根据你的需要进行调整。
静态压缩总是毫无疑问,因为与直接静态文件服务相比,它增加了非常少的开销,并提供了可靠的压缩。 动态压缩有点棘手,因为它会给服务器增加一些开销,因此可能需要进行一些调整才能在CPU负载与压缩比之间取得适当的平衡。 看看亚马逊,雅虎,NewEgg等大型网站 - 他们都在使用
http://weblog.west-wind.com/posts/2011/May/05/Builtin-GZipDeflate-Compression-on-IIS-7x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.