对于经典应用程序池,Gzip压缩在IIS7.5中不起作用

Luy*_*Sun 7 compression asp.net iis gzip

我试图弄清楚为什么使用经典应用程序池的一个站点不会被压缩.此应用程序池已启用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>
Run Code Online (Sandbox Code Playgroud)

并在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
Run Code Online (Sandbox Code Playgroud)

我加倍检查我是否安装了dynamicCompression功能.在最终输出中,Content-Encoding标头一直被删除.我还应该看看什么?我读到一些函数不适用于经典应用程序池.这会导致问题吗?

Ali*_* Gh 1

IIS 7 极大地改进了内部压缩功能,使其比以前的版本更容易利用 Web 服务器内置的\xe2\x80\x99 压缩功能。IIS 7 还支持动态压缩,允许自动压缩在您自己的应用程序(ASP.NET 或其他应用程序!)中创建的内容。该方案基于内容类型嗅探,因此它适用于任何类型的 Web 应用程序框架。

\n

虽然 IIS 7 上的静态压缩非常容易设置,并且默认情况下对于大多数文本内容(text/*包括 HTML 和 CSS,以及 JavaScript、Atom、XAML、XML)打开,但设置动态压缩则有点复杂。涉及,主要是因为各种默认压缩设置是在 IIS \xe2\x80\x93> ASP.NET 层次结构中的多个位置设置的。

\n

让\xe2\x80\x99s 看一下可用的两种方法:

\n
    \n
  • 静态压缩
    \n压缩硬盘中的静态内容。IIS 可以通过以下方式缓存此内容:压缩文件一次并将压缩文件存储在磁盘上,并在请求静态内容且未更改\xe2\x80\x99 时提供压缩别名。这样做的开销很小,应该积极启用。
  • \n
  • 动态压缩
    \n适用于从应用程序(例如 ASP.NET 应用程序)\n生成的应用程序输出。与静态内容不同,每次请求动态内容的页面重新生成其内容时,都必须对动态内容进行压缩。因此,动态压缩比静态缓存具有更大的影响。
  • \n
\n

如何配置压缩

\n

IIS 7.x 中的压缩在空间中配置有两个.config文件元素<system.WebServer>。这些元素可以设置在 IIS/ASP.NET 配置管道中的任何位置,从 ApplicationHost.config 一直到本地 web.config 文件。以下是%windir%\\System32\\inetsrv\\configIIS 7.5 上 ApplicationHost.config(在文件夹中)的默认设置,并进行了一些小调整(添加了 json 输出并启用了动态压缩):

\n
<?xml version="1.0" encoding="UTF-8"?>\n<configuration>\n  <system.webServer>\n    \n    <httpCompression directory="%SystemDrive%\\inetpub\\temp\\IIS Temporary Compressed Files">\n      <scheme name="gzip" dll="%Windir%\\system32\\inetsrv\\gzip.dll" staticCompressionLevel="9" />\n      <dynamicTypes>\n        <add mimeType="text/*" enabled="true" />\n        <add mimeType="message/*" enabled="true" />\n        <add mimeType="application/x-javascript" enabled="true" />\n        <add mimeType="application/json" enabled="true" />\n        <add mimeType="*/*" enabled="false" />\n      </dynamicTypes>\n      <staticTypes>\n        <add mimeType="text/*" enabled="true" />\n        <add mimeType="message/*" enabled="true" />\n        <add mimeType="application/x-javascript" enabled="true" />\n        <add mimeType="application/atom+xml" enabled="true" />\n        <add mimeType="application/xaml+xml" enabled="true" />\n        <add mimeType="*/*" enabled="false" />\n      </staticTypes>\n    </httpCompression>\n    \n    <urlCompression doStaticCompression="true" doDynamicCompression="true" />\n    \n  </system.webServer>\n</configuration>\n
Run Code Online (Sandbox Code Playgroud)\n

您可以分别在此处找到有关按键的文档:

\n\n

元素httpCompression\xe2\x80\x93 压缩什么以及如何压缩

\n

基本上httpCompression配置要压缩的类型以及如何压缩它们。它指定处理 gzip 编码的 DLL 以及要压缩的文档类型。类型是基于 mime-types 设置的,mime-types 会查看 HTTP 响应中返回的 Content-Type 标头。例如,我将 application/json to mime 类型添加到上面的动态压缩类型中,以允许压缩该内容,因为我有相当多的 AJAX 内容发送到客户端。

\n

元素urlCompression\xe2\x80\x93 启用和禁用压缩

\n

urlCompression元素是打开和关闭压缩的快速方法。默认情况下,静态压缩在服务器范围内启用,动态压缩在服务器范围内禁用。这可能有点令人困惑,因为该httpCompression元素还有一个doDynamicCompression默认设置为 true 的属性,但urlCompression同名的属性实际上会覆盖它。

\n

urlCompression元素只有三个属性:doStaticCompressiondoDynamicCompressiondynamicCompressionBeforeCache。属性doCompression是是否启用压缩的最终决定因素,因此\xe2\x80\x99 最好明确说明!默认为doDynamicCompression=\'false\xe2\x80\x9d,但是doStaticCompression="true"!\n默认情况下启用静态压缩,不启用动态压缩

\n

由于静态压缩在 IIS 7 中非常高效,因此默认在服务器范围内启用它\xe2\x80\x99,并且可能没有理由更改该设置。然而,由于动态压缩需要更多资源,因此默认情况下处于关闭状态。如果您想启用动态压缩,则必须处理一些问题,即在 ApplicationHost.config 中启用它不起作用。环境:

\n

<urlCompression doDynamicCompression="true" />

\n

在 applicationhost.config 中似乎没有效果,我必须将此元素移动到本地 web.config 中才能使动态压缩工作。这实际上是一个明智的选择,因为您\xe2\x80\x99 不太可能希望在服务器上的每个应用程序中进行动态压缩。相反,应该在有意义的地方选择性地应用动态压缩。但是,没有任何地方记录 applicationhost.config 中的设置不起作用(或更可能在配置层次结构中的某个位置被覆盖并禁用)。

\n

所以:记得在web.config中设置doDynamicCompression=\xe2\x80\x9dtrue\xe2\x80\x9d

\n

静态压缩的工作原理

\n

静态压缩适用于从磁盘上的文件加载的静态内容。由于此内容是静态的,并且不会频繁更改,例如.js.css静态 HTML 内容 xe2x80x93,因此 IIS 很容易压缩然后缓存压缩内容。其工作方式是,IIS 将文件压缩到服务器\xe2\x80\x99s 硬盘上的一个特殊文件夹中,然后如果请求已压缩的内容且底层文件资源未更改,则从该位置读取内容。提供已压缩文件的语义非常高效 \xe2\x80\x93 IIS 仍检查文件更改,但仅提供压缩文件夹中已压缩文件的服务。

\n

压缩文件夹位于:
\n%windir%\\inetpub\\temp\\IIS Temporary Compressed Files\\ApplicationPool\\

\n

如果您查看子文件夹,您将发现\xe2\x80\x99 压缩文件:

\n

\n

压缩文件夹

\n

这些文件被预先压缩,IIS 将它们直接提供给客户端,直到底层文件发生更改。

\n

正如我之前提到的,\xe2\x80\x93 静态压缩默认处于启用状态,并且 \xe2\x80\x99 几乎没有理由关闭该功能,因为它非常高效并且开箱即用。您可能想要做的一项调整是将压缩级别设置为最大。由于 IIS 很少压缩内容,因此应用最大压缩是有意义的。您可以使用方案元素上的 staticCompressionLevel 设置来执行此操作:

\n

<scheme name="gzip" dll="%Windir%\\system32\\inetsrv\\gzip.dll" staticCompressionLevel="9" />

\n

除此之外,默认设置可能就很好。

\n

动态压缩 \xe2\x80\x93 没那么快!

\n

默认情况下动态压缩是禁用的,\xe2\x80\x99s实际上是相当明智的\xe2\x80\x93你应该非常小心地使用动态压缩并考虑你想要压缩什么内容。在大多数应用程序中,压缩所有生成的内容是没有意义的,因为它会产生大量的开销。Scott Fortsyth 有一篇很棒的文章,详细介绍了一些性能数据以及动态压缩的影响有多大。根据服务器的繁忙程度,您可以尝试压缩并查看它对服务器\xe2\x80\x99s 性能的影响。

\n

您还可以调整一些设置来最大限度地减少动态压缩的开销。具体来说,http压缩键有几个与 CPU 相关的键,可以帮助最大限度地减少动态压缩对繁忙服务器的影响:

\n
    \n
  • dynamicCompressionDisableCpuUsage
  • \n
  • dynamicCompressionEnableCpuUsage
  • \n
\n

默认情况下,这些设置为9050这意味着当 CPU 达到 90% 时,将禁用压缩,直到 CPU 利用率回落到 50%。同样,这实际上是相当明智的,因为它在可用时利用来自压缩的 CPU 功率,并在达到阈值时下降。它\xe2\x80\x99 是在利用率较低时使用大型服务器上的一些额外 CPU 能力的好方法。同样,这些设置是您可能必须使用的东西。我可能会将上限设置为略低于 90% 或 70% 左右,以使此功能仅在有\xe2\x80\x99s 大量备用电源时才会启动。I\xe2\x80\x99m 不太确定 IIS 使用的这些 CPU 读数有多准确,因为即使在低负载期间,Web 服务器上的 CPU 使用率也会急剧上升。Don\xe2\x80\x99t 信任设置 \xe2\x80\x93 执行一些负载测试或在实时环境中监视服务器,以了解哪些值对您的环境有意义。

\n

最后,对于动态压缩,我倾向于为 JSON 数据添加一种 Mime 类型,因为我的许多应用程序通过线路发送大量 JSON 数据。您可以使用 application/json 内容类型来做到这一点:

\n

<add mimeType="application/json" enabled="true" />

\n

放气压缩怎么样?

\n

默认压缩是 GZip。文档提示您可以使用不同的压缩方案并提到 Deflate 压缩。果然,您可以将压缩设置更改为:

\n

<scheme name="deflate" dll="%Windir%\\system32\\inetsrv\\gzip.dll" staticCompressionLevel="9" />

\n

获得放气式压缩。deflate 算法产生稍微更紧凑的输出,因此我倾向于比 GZip 更喜欢它,但更多的 HTTP 客户端(浏览器除外)支持 GZip 而不是 Deflate,所以如果您构建 Web API,请小心使用此选项。

\n

对于立即应用上述值,我也遇到了一些问题。更改 applicationhost.config 中的方案并没有立即显示在网站上。它要求我执行完整的 IISReset 才能显示该更改,然后才能看到压缩内容的更改。使用 deflate \xe2\x80\x93 稍微压缩内容,不确定它 \xe2\x80\x99 是否值得稍微不常见的压缩类型,但该选项至少可用。

\n

IIS 7 终于让 GZip 变得简单

\n

总而言之,IIS 7 最终使 GZip 变得简单,即使配置设置有点迟钝并且文档严重缺乏。但是,一旦您了解了我\xe2\x80\x99在这里描述的基本设置,并且您可以在本地 web.config 中覆盖所有这些,那么\xe2\x80\x99就可以非常直接地配置 GZip 支持并对其进行精确调整满足您的需求。

\n

静态压缩完全是理所当然的,因为与直接静态文件服务相比,它增加的开销非常少,并且提供可靠的压缩。动态压缩有点棘手,因为它确实增加了服务器的一些开销,因此可能需要进行一些调整才能获得 CPU 负载与压缩比的正确平衡。看看亚马逊、雅虎、NewEgg 等大型网站。 \xe2\x80\x93 他们都使用

\n
\n

参考 :

\n

http://weblog.west-wind.com/posts/2011/May/05/Builtin-GZipDeflate-Compression-on-IIS-7x

\n