Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IIS 合理配置缓存 #197

Closed
Dream4ever opened this issue May 23, 2022 · 0 comments
Closed

IIS 合理配置缓存 #197

Dream4ever opened this issue May 23, 2022 · 0 comments

Comments

@Dream4ever
Copy link
Owner

Dream4ever commented May 23, 2022

最终结论

对于静态文件,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 页面里的内容。每次修改后都用微信扫码,结果真的显示的是最新的内容!

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


旧的记录:

@Dream4ever Dream4ever changed the title IIS 配置缓存 IIS 合理配置缓存 May 23, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant