IIS7:静态和动态内容压缩之间的差异

时间:2011-04-10 06:34:04

标签: iis-7 gzip httpmodule

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)时,在缓存请求中,我的自定义模块被提供了已经gzip压缩的内容。当我将text / css移动到动态压缩请求列表时,它全部开始工作。但我希望有一个更加坚实的证据,证明它确实是正确的方法。还有其他已知的后果/问题吗?

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

RQ_MAP_REQUEST_HANDLER
RQ_EXECUTE_REQUEST_HANDLER

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

2 个答案:

答案 0 :(得分:13)

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

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

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

因此动态和静态参考内容并影响可以使用的策略。

一些参考资料

答案 1 :(得分:0)

尝试使用IIS压缩功能,在我看来,动态模块和静态模块并不依赖于动态或静态内容(特别是对于动态模块)。

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

看来动态压缩模块不仅限于动态内容。它确实压缩了静态内容,只要它与mime类型列表匹配,并且尚未压缩。所以我认为它应该被理解为一个动态的“压缩模块”,从某种意义上讲,它会在每个响应上触发(基于其mime类型标准,并在accept-encoding请求标头上)。

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

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

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

不幸的是,我没有找到任何备份上述声明的文档。

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