我在一个容器中的 nginx 代理后面有一个原始服务器,前面有一个 CDN。
我希望我的 HTML 页面在 CDN 上缓存 1 分钟,因此我在其响应上设置了cache-control: public
和cache-control: max-age=60
标头。显然,每次缓存未命中时,CDN 都会一直转到原始服务器重新呈现页面。
现在,原始服务器和 nginx 实例位于同一个容器中。我想要做的是让 nginx 缓存任何带有cache-control: public
标头的原始服务器响应,缓存时间远超过 1 分钟 - 基本上是无限期的。这是因为我知道,只要容器存在,原始服务器就会处于同一版本,响应也会相同。
CDN 当然不知道这一点,它只是访问一个 URL,这就是为什么最大使用期限只有一分钟——在新的部署中,我希望新内容在一分钟内刷新到 CDN 上——但如果能将 nginx 作为原始服务器前面的缓存,这样原始服务器就不必在每次 CDN 缓存未命中时重新呈现相同的页面(如果它实际上仍以相同的版本运行)。
有没有一种优雅的方法来配置 nginx 缓存来执行此类操作?即忽略cache-control: max-age
标头并无限期缓存,然后传递该标头以便由 CDN 处理?
使用类似proxy_ignore_headers Cache-Control
和的proxy_cache_valid 200 1y
方法不起作用,因为我不想缓存每个页面,只想缓存cache-control: public
设置了标头的页面。基本上,我只需要对这些响应进行max-age
大量乘以或静态设置为非常大的值。
这可能吗?我知道这可能不是 nginx 假设的模型,它的缓存是“短暂的”,并且在重新部署原始服务器时会自动消失,但目前我能想到的唯一一种黑客方法是在原始服务器上将我的max-age
标头设置为 10000x,然后在转发到 CDN 之前将它们重写为 / 10000 - 我真的希望有比这更好的方法。
答案1
让后端将标头“X-Accel-Expires”设置为非常高的值(例如 86400 = 1 天),并在将响应发送到客户端之前取消设置该标头(您永远不知道 CDN 是否“理解” “X-Accel-Expires”)。