【问题标题】:IIS7: Differences between static and dynamic content compressionIIS7:静态和动态内容压缩之间的差异
【发布时间】:2011-08-02 09:11:25
【问题描述】:

IIS 支持两种类型的压缩:静态 内容压缩和动态 内容压缩。根据applicationHost.config,它们由不同的模块处理:DynamicCompressionModule (compdyn.dll) 和StaticCompressionModule (compstat.dll),它们被配置为压缩不同类型的请求。另外,我猜动态压缩不会缓存压缩请求而不是静态压缩(默认情况下,压缩文件保存到%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files)。

但是,除了那些明显的差异之外,我怀疑还有其他东西。我认为它们以稍微不同的方式连接到 IIS 管道。有人能了解更多细节吗?

我发现的方法是I was toying with a custom module for modifying CSS files on fly。当打开静态压缩(并设置为处理默认的文件集,即 text/css)时,在缓存请求时,我的自定义模块将获得已压缩的内容。当我将 text/css 移动到动态压缩请求列表时,一切都开始工作了。但我想有一个更可靠的证据证明这确实是正确的方法。还有其他一些已知的后果/问题吗?

更新:我想我可能对它发生的原因有一个理论。它可能不是 100% 正确,但它至少可以解释观察到的行为。我认为静态压缩模块将自己注册到以下事件(以及其他一些事件):

RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER

然后当一个静态文件的请求被服务时,OnMapRequestHandler中的静态压缩模块检查该文件之前是否被压缩过,以及实际文件是否没有被改变。如果是这样,它会将请求重新映射到自身(使用IMapHandlerProvider 返回适当的重定向)。当它稍后在OnExecuteRequestHandler 中实际提供响应时,它会发送压缩文件。另一方面,如果该文件之前没有被压缩过或者它已经改变了,它不会进行映射重定向,而是让静态内容模块为请求提供服务,然后在OnPostExecuteRequestHandler 压缩内容(并更新它的缓存)。如上所述,我并不是说这正是正在发生的事情(我不知道源代码),它可能只是一个近似值。此外,动态压缩模块很可能不会做任何这些。它有时只是在 RQ_EXECUTE_REQUEST_HANDLER 之后压缩传出响应。

【问题讨论】:

    标签: iis-7 gzip httpmodule


    【解决方案1】:

    在尝试 IIS 压缩功能时,我觉得动态模块和静态模块与动态或静态内容(尤其是动态模块)没有那么紧密的联系。

    在动态模块上激活text/html(或text/*)mime 类型的压缩,而不是在静态模块上。访问 .html 文件。检查浏览器中的 http 响应:它是压缩的。 (在 2008R2 服务器上的 IIS 7.5 上测试。)

    看来动态压缩模块并不局限于动态内容。它会压缩静态内容,前提是它匹配其 mime 类型列表并且尚未压缩。所以我认为它应该被理解为一个动态的“压缩模块”,因为它在每个响应上被触发(基于它的 mime 类型标准和accept-encoding 请求头)。

    虽然静态压缩模块被触发有点像处理文件的后台进程,并且只有在将压缩输出放入缓存时才开始提供压缩输出。由于静态压缩模块确实在模块堆栈中执行得更远,它确实在动态压缩模块之前处理响应,因此如果它具有要提供的压缩输出,则优先于动态压缩模块。

    因此,对于您的特定用例,您应该禁用 text/css mime 类型的静态压缩模块(如果存在,请注意删除 text\*)以避免缓存问题破坏您的自定义 css 修补模块。

    您还可以在动态压缩模块中激活text/css 的压缩,以在这种情况下替换静态压缩模块。但当然,它不会利用静态压缩模块缓存能力。

    很遗憾,我没有找到任何支持上述陈述的文档。

    另一个选项可能是尝试更改 IIS 模块执行顺序。您必须在站点配置中将它们全部删除,然后重新添加它们,可能在静态压缩之前插入您的自定义模块。但这可能是一条棘手的道路。

    【讨论】:

      【解决方案2】:

      你的问题不是很清楚,所以我会回答一个问题,希望是你的问题。

      静态压缩的目的是压缩原本直接从硬盘驱动器 (Css/images/javascript) 提供的文件,因此它对每个文件进行一次压缩并将压缩文件保存到磁盘。这可以为不经常更改的静态文件提供非常快速且廉价的压缩内容服务。说大多数网站应该启用静态压缩是一个非常安全的建议。

      动态压缩的目的是压缩来自 ISS 模块(asp、asp.net、php 等)的动态响应。由于每个请求的响应可能不同,因此无法缓存压缩输出。此功能是 IIS6 的新功能,尽管在某些环境中可以实现该效果,例如通过在 ASP.Net 中实现 HttpFilter。由于每个请求都需要动态压缩,这比静态压缩要占用更多的 CPU 资源。因此,如果服务器受 CPU 限制,这可能不是一个好的选择。大多数网站都是网络和/或数据库绑定的,所以这通常是个好主意。

      所以动态和静态是指内容和效果可以使用什么策略。

      一些参考资料

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 2013-03-08
        相关资源
        最近更新 更多