现在很多站点和项目开始使用前后端分离的架构,通常我们前端的产物为 HTML、JS和CSS,这些文件我们会部署到 WebService 或者 CDN,当然常用的 WebService 有 Nginx、IIS、Tomcat,这些 Web 容器通常会对静态文件做一些缓存设置,导致我们发布的站点用户看不到最新的更新。说说这种静态资源的站点的缓存问题如何解决。
通常我们会对服务器设置这种缓存,当文件的最后修改事件发生改变后,通知浏览器清除原文件的缓存用新的文件。当然这种缓存有时候不好使。
HTML 是整个站点的结构和模版,通常我们希望它修改后浏览器端就随之更新,但是有一些运营商会对这些静态文件做一些不必要的优化,让 HTML 文件缓存起来,于是我们经常会对 HTML 的 Expires 设置为 0,这样让它始终获取最新的 HTML。
通过自动化工具清除缓存,每次构建的时候对这些文件进行 MD5,然后通过 MD5 的值给文件重命名(同时修改所有对这个文件的引用),这样一来如果文件修改后,他的文件名也会随之修改,缓存自然不存在了。
这个问题通常是弹性负载均衡导致的,WebService 在请求后端接口时通过 HTTP 去访问一个 URL 地址(访问地址的过程中会对预警进行 DNS 解析),WebService 通常会对请求进行优化,DNS 解析的 IP 会缓存起来下次请求同样的域名就不需要浪费解析的时间了;但是弹性的负载均衡域名后面的 IP 经常会改变,会导致被缓存的 IP 无法访问 。如果是 Nginx WebService 可以这样设置:http://tenzer.dk/nginx-with-dynamic-upstreams/