在反向代理模式下,Squid 可以缓存来自网络中设备以前访问过的网站的内容。
如果远程站点上的内容以某种方式发生变化(可能是通过代码推送)会发生什么?Squid 如何知道它需要访问原始站点来获取资产的新版本,而不是缓存?
现在对于基于动态 javascript 的(单页)网站来说,这是否是一个更大的问题?
一个附带问题:“反向代理”与 Squid 的“加速器模式”本质上是一样的吗?
在反向代理模式下,Squid 可以缓存来自网络中设备以前访问过的网站的内容。
如果远程站点上的内容以某种方式发生变化(可能是通过代码推送)会发生什么?Squid 如何知道它需要访问原始站点来获取资产的新版本,而不是缓存?
现在对于基于动态 javascript 的(单页)网站来说,这是否是一个更大的问题?
一个附带问题:“反向代理”与 Squid 的“加速器模式”本质上是一样的吗?
是的,Squid 将使用解释后端服务器随每个响应发送的标头的传统方法缓存来自后端服务器的响应。
不应缓存的动态内容的典型响应如下所示:
从技术上讲,这些标头中的每一个本身已经足以声明响应动态的内容,但传统观点似乎仍然使用它们。货物崇拜编程或向后兼容性?
Cache-Control是您最应该关心的标题。这些是您的 Squid 反向代理以及任何中间缓存代理服务器(包括实际浏览器)的缓存说明。选项包括:
private
或public
;私有响应是特定于用户的,不应被缓存,公共响应可能会被缓存。no-cache
主要做它听起来的样子,并且是为每个后续请求重新验证资源的指令。尽管在验证证明资源仍然有效之后,仍然可以提供缓存的响应。no-store
一个明确的指示,即响应必须被视为机密并且根本不存储,比上面的 no-cache 选项强一点。max-age
in seconds 覆盖 Expires 标头并指示资产何时过期并应从缓存中清除。s-maxage
在几秒钟内与上述相同,但对于内容交付网络等共享缓存。Expires是设置缓存指令的经典方式,简单的时间戳不超过未来1年。
Pragma是一个非常老派的标头,将其设置为
no-cache
将被任何最近的浏览器解释为Cache-Control: no-cache
并且我认为它不再出现在最近的 HTTP 协议规范中,尽管仍然因历史的向后兼容性而受到尊重。为更多静态内容设置的标头应指示 Squid(以及访问者的 Web 浏览器)可以缓存这些响应。
问题是除非您手动刷新 Squid 缓存内容,否则对象将在其缓存控制标头的持续时间内存储。Squid 没有您在 Varnish 中找到的规定,也没有软件 CDN 用于履行 PURGE 请求以使特定缓存对象无效的规定。
解决方法是让您的内容管理解决方案确保对静态内容的更新带有新的文件名,而不是覆盖现有文件。
当然,您的本地配置可以覆盖标题中设置的说明。
是的,在 Squid 上下文中,反向代理和网络加速器是一回事。