CDN:跨边缘机器同步缓存

CDN:跨边缘机器同步缓存

我基于 nginx 的 HTTP 缓存为我的静态网站构建了一个廉价的 CDN。

上下文。以下是我的缓存配置的一些部分:

proxy_cache_key "$scheme://$host$uri"; 
proxy_cache_valid 200 301 302 1200d; 

我有一台原点机器和大约 10 台边缘机器,它们都代理回不同位置的原点。原点也兼作一个边缘。所有这些机器上的缓存都已预热。

现在,某个 URL 中的内容会不时更新。在负载平衡环境中使用粘性会话,这意味着一个边缘和源上的缓存将使用 proxy_cache_bypass 机制失效(我从管理部分更新了内容并访问了 URL。由于我设置了 cookie,Nginx 会执行代理 BYPASS 来刷新内容。)

这里的问题是,在所有其他边缘位置,该特定 URL 的缓存有效期最长为 1200 天。这意味着他们永远不会从原点获取数据。

在这种情况下,我如何确保所有边缘服务器上的缓存均已更新

这里建议的方法是这样做的:

循环遍历所有边并运行

curl -o /dev/null -k -I --resolve cdn.yourdomain.com:80:127.0.0.1 https://cdn.yourdomain.com/img/logo.png 

有没有正确的方法来解决此问题?

答案1

Cache-Control: max-age=...我认为,在源响应上设置合理的标头比手动强制缓存刷新某些内容更容易。然后,在 nginx 缓存上,如果您已proxy_cache_revalidate on启用,缓存将每一段max-age时间仅检查一次源中的特定内容。如果源上的内容没有变化,则 nginx 将继续从其缓存中提供服务。但是,如果源内容发生变化,nginx 将检索并存储新副本,然后重新开始整个过程​​,再次检查下次何时到期max-age

答案2

1200天,很多。

我真的不明白该 curl 命令如何帮助更新缓存(如果该 URL 已存在于缓存中)

您需要以某种方式清除边缘上的缓存。

商业订阅有一个 proxy_cache_purge 方法(http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_purge),但我猜你没有。

一个免费的替代方案,来自 Frickle 的一个旧模块,ngx_cache_purge(https://github.com/FRiCKLE/ngx_cache_purge),但说实话,我没有使用最新的 Nginx 版本。快速谷歌搜索表明它仍然有效。你可以在每个边缘配置中使用类似这样的内容:

        位置 ~ /purge(/.*) {
            允许 1.2.3.4;
            全部否认;
            proxy_cache_purge tmpcache $1$is_args$args;
        }

然后从 1.2.3.4 开始,您可以执行类似操作,其中 5.6.7.8 是第一个边缘 IP(这将删除该边缘上的 /path/to/file.jpg)。然后您应该循环遍历所有其他边缘服务器的 IPcurl -H "Host: yourdomain.com" http://5.6.7.8/purge/path/to/file.jpg"

相关内容