【问题标题】:IIS Compression with in code GZipping?使用代码 GZipping 进行 IIS 压缩?
【发布时间】:2012-04-06 13:49:08
【问题描述】:

我正在将 gzipping 添加到我的所有静态内容和 .net 4 站点的 html 输出中。

我还在 IIS 7.5 中启用了压缩(静态和动态),我发现在 IIS 中启用压缩会覆盖这些资源的 Vary: Accept-Encoding 标头。

所以,我想知道的是,真的需要在 IIS 中启用压缩,因为我已经在压缩东西了吗?

所以,我做了一些测试,我发现如下:

Utilizing IIS Static and Dynamic Compression, with code compression:
CPU Load: 35%
Memory Load: 28M

Utilizing IIS Static and Dynamic Compression, without code compression:
CPU Load: 34%
Memory Load: 28M

Non-Utilizing Static and Dynamic Compression In IIS, with code compression:
CPU Load: 14%
Memory Load: 32M

因此,根据我的发现,我同意,在代码中执行此操作时无需使用 IIS 压缩。尽管内存消耗略高,但 CPU 负载显着降低,足以使代码内压缩更有效地为文件提供服务。

现在,我真正的重点是找出并摆脱 IIS 对 Vary: Accept-Encoding 标头的覆盖。其中,无论是否启用 IIS 压缩,它似乎都没有效果。标题仍然没有被添加......那么,你能帮忙吗?

这是我正在实现的缓存代码,请注意,在触发包含此代码的方法之前,我正在通过 context.Response.ClearHeaders() 清除标头:

    With context.Response
        .AddHeader("Cache-Control", "store, cache")
        .AddHeader("Pragma", "cache")
        .AddHeader("Cache-Control", "max-age=21600")
        .AddHeader("ETag", Date.Now.Ticks)
        .AddHeader("Expires", DateTime.Now.AddYears(1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT")
        .AddHeader("Vary", "Accept-Encoding")
        .AppendHeader("Vary", "Accept-Encoding")
        .Cache.SetVaryByCustom("Accept-Encoding")
        .Cache.SetOmitVaryStar(True)
        .Cache.VaryByParams.IgnoreParams = True
        .Cache.SetAllowResponseInBrowserHistory(True)
        .Cache.SetCacheability(Web.HttpCacheability.Public)
        .Cache.SetValidUntilExpires(True)
        .Cache.SetLastModified(DateTime.Now.AddYears(-1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT")
        .CacheControl = "public" '
        .Expires = 24 * 60 * 366
        .ExpiresAbsolute = DateTime.Now.AddYears(1).ToString("ddd, dd MMM yyyy hh:mm:ss") + " GMT"
    End With

【问题讨论】:

  • 我想知道相反的情况:当 IIS 提供压缩时,真的需要压缩代码吗?弄清楚你这样做是否真的有充分的理由。
  • 为什么要添加自己的编码?又是怎样的编码方式?
  • 我想确保压缩静态资源。大多数共享主机系统默认不启用压缩。因此,通过在代码中执行,确保在这些系统上资源将被 gzip 压缩。只有“文本”文件被压缩...css、js、html、字体文件等...
  • @o7thWebDesign 没有深入了解您的问题,我有两个建议:(1)我怀疑您的测试是否准确,原因有一个:听起来您正在动态提供静态内容。这将排除所有静态压缩和缓存。如果没有通过 ASP.NET 管道提供静态内容,则会产生最佳可伸缩性。 (2) 在 Vary 标头上,我对所有缓存控制标头的了解不够详细,无法说明此处的正确性。研究所有配置文件设置 (msdn.microsoft.com/en-us/library/aa347461%28v=vs.90%29.aspx)。
  • 其实是动态服务的。所有脚本、样式表、图像和字体都通过 httphandler 传递以设置正确的缓存标头。这只是必要的,因为并非所有第 3 方主机都通过 IIS 执行此操作。

标签: asp.net .net iis gzip gzipstream


【解决方案1】:

您需要明确知道要在代码中应用压缩的 MIME 类型。然后,您可以为这些 MIME 类型禁用 IIS 压缩。

您的.config 文件应类似于以下文件。您会注意到应用压缩的 MIME 类型已全部列出。明智地在您的代码或 IIS 中关闭 MIME 类型的压缩,以使代码中压缩的内容不会被 IIS 压缩,反之亦然。

例如,如果您的 HTML 全部压缩在代码中,您可以指定:

    <add mimeType="text/html" enabled="false" />

摘自applicationHosts.config文件:

<system.webServer>
<httpCompression
    directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"
    dynamicCompressionDisableCpuUsage="90"
    dynamicCompressionEnableCpuUsage="80"
    maxDiskSpaceUsage="100" minFileSizeForComp="2700"
    noCompressionForRange="true"
    sendCacheHeaders="false"
    staticCompressionDisableCpuUsage="100"
    staticCompressionEnableCpuUsage="80"
    >
    <scheme name="gzip"
        dll="%Windir%\system32\inetsrv\gzip.dll"
        dynamicCompressionLevel=”4”
        staticCompressionLevel=”7” />
    <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="message/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="application/xml" 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="application/json" enabled="true" />
        <add mimeType="application/atom+xml" enabled="true" />
        <add mimeType="application/rss+xml" enabled="true" />
        <add mimeType="application/xaml+xml" enabled="true" />
        <add mimeType="application/xml" enabled="true" />
        <add mimeType="image/svg+xml" enabled="true" />
        <add mimeType="*/*" enabled="false" />
    </staticTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
    dynamicCompressionBeforeCache=”true” />
</system.webServer>

请注意,如果您修改applicationHosts.config,它会影响您服务器上的所有网站,因此您需要注意,任何未在代码中应用压缩的网站都不会被压缩。

另请注意,通常不应压缩二进制内容(即图像、视频)。这些资源已经在各自的容器中压缩(即 .JPG、.MP4)。确保您没有压缩已压缩的内容类型。

我已经写了有关压缩设置的更多详细信息,您可能希望在我的回答中查看:https://stackoverflow.com/a/10051876/733805

【讨论】:

  • 绝对方便,但我所做的是确保如果有人使用该系统,将其安装在不允许此类更高级别访问的服务器上可以进行压缩
  • 所以在我的测试服务器(在我的地下室)上,我安装了 IIS 7.5 来对所有静态和动态资源进行压缩。我还设置了代码来 gzip 任何 js、css、html 输出、字体文件等......因为我需要考虑那些可能在没有在 IIS 中启用压缩的服务器上使用我的系统的人。我担心的是,在启用压缩的服务器上,它会浪费服务器资源吗?真的有必要吗?
  • @o7thWebDesign 我相当肯定,如果在两个地方都启用压缩,它会浪费资源。我不知道 IIS 是否检测到内容已被压缩。 IIS 可能会进行双重加密,从而导致损坏或文件变大。你必须对此进行测试。其次,我不确定本地web.config是否可以控制IIS压缩;如果是这样,一些管理员可能会将其锁定。两种思想流派:(1)追求您自己的压缩的复杂性以提供作为功能;或者,(2) 将压缩作为用户寻找更好托管的理由。
  • @o7thWebDesign 仅当您关心节省带宽和提高页面加载速度时才需要压缩。
  • :) 肯定希望提高加载速度 :) 我做了一些测试。我会将其发布为答案,以便我可以更好地格式化=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2018-04-16
  • 2021-04-26
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多