我在容器中的nginx代理后面有一个原始服务器,前面有一个CDN。
我希望我的HTML页面在CDN上缓存1分钟,所以我在它们的响应中设置了cache-control: public和cache-control: max-age=60头。显然,在每次缓存丢失时,CDN都会一直到原始服务器重新呈现页面。
现在,源服务器和nginx实例位于同一个容器中。我想做的是让nginx缓存任何带有cache-control: public头的原始服务器响应,时间远远超过1分钟--基本上是无限期的。这是因为我知道,只要容器在附近,源服务器就会处于相同的版本,响应将是相同的。
CDN当然不知道这一点,它只是点击了一个URL,这就是为什么在一个新的部署中,最大时长仅为一分钟--我希望在一分钟内在CDN上刷新新内容--但是如果nginx作为一个缓存出现在源服务器前面,那么如果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头设置为10000 x,并在转发到CDN之前将它们重写为be /10000--我真的希望有一个比这更好的方法来完成它。
发布于 2020-07-06 13:37:39
让后端设置标题“X-Accel-到期”到一个非常高的值(例如。86400 =1天),并在向客户端发送响应之前取消该标头(您永远不知道CDN“理解"X-Accel-Expires")。
请参阅代理_缓存文档
https://serverfault.com/questions/1024078
复制相似问题