Skip to content

IIS 合理配置缓存 #197

@Dream4ever

Description

@Dream4ever

最终结论

对于静态文件,IIS 自己会处理缓存相关事宜,无需手动配置。

初始研究

关键词:iis 8 cache

官方文档:Caching

相关讨论:Browser Caching using IIS8.5, am I doing it right?

深入研究

添加缓存的方式

查看 IIS 的 输出缓存 部分,发现只能给每种文件扩展名添加缓存,没法给指定目录添加缓存。

两种缓存分类

然后缓存分为两种:用户模式缓存和内核模式缓存。

Google iis user-mode caching vs kernel-mode caching 之后,看到这篇解释:difference between kernel mode and user mode caching in IIS 8.0。简单来说,内核模式缓存会直达最基础的系统层面,不会触及 IIS 和 ASP.NET,所以 IIS 相关的验证/授权和其他设置都无法应用到内核模式缓存上。但是从另一个方面来看,内核模式缓存肯定是更快的。

至于具体什么情况下内核模式缓存无效,可以查看 MSDN 上的这篇文档:Instances in which HTTP.sys doesn't cache content

缓存过期方式

一种方式是 文件更改通知,文件如果没有变化,缓存就不更新。

另一种方式是 时间间隔,也就是指定时间之后缓存失效。

另外对于 用户模式缓存 来说,还可以根据 查询字符串变量HTTP 标头 来缓存文件的多个版本,这个后面有空了再深入研究一下。

添加的缓存类型

  • 页面文件:html/js/css
  • 图片文件:jpg/png
  • 音视频文件:m3u8/ts
  • 字体文件:woff/woff2/ttf
  • 文档:docx/pptx/pdf/rar/zip

实际应用

最开始添加的是内核模式缓存,然后在浏览器中调试页面,取消“跳过缓存”选项,发现刷新之后服务端返回的还是更改前的页面。

于是又给所有文件类型再添加用户模式缓存,然后再刷新页面,这回浏览器终于可以在不刷新缓存的情况下,拿到更新后的页面了,查看 Etag 字段也是更新了的,看来还是得用户模式缓存才行,或者是两种缓存都启用。

问题探讨

image

上图中官方文档说不建议给静态文件设置缓存,那怎么让 IIS 在静态文件在修改后及时返回最新的文件呢?

之后在 IIS 的缓存设置中,配置 .html 在两种模式下都不缓存,然后修改页面,并在浏览器中不跳过缓存地刷新页面,结果也能看到修改后的页面。

然后在官方文档 When to Use Output Caching | Configure IIS 7 Output Caching 中,看到了下面这段话:

image

也就是说静态内容 IIS 自己会缓存,也会刷新修改后的缓存。于是在 IIS 中把所有静态文件的缓存设置都删除,然后重启 IIS 根节点,并修改 HTML 页面里的内容。每次修改后都用微信扫码,结果真的显示的是最新的内容!

这么说的话,之前的缓存设置其实是没有必要的?那就先把静态文件的缓存设置删掉,以后再看情况决定是否再启用。


旧的记录:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions