使 Nginx 缓存尊重 cache-control headers
Make Nginx caching respect cache-control headers
Nginx 可以缓存内容,即充当 reverse-proxy,但清除时间必须在 Nginx 配置中固定。
有没有办法让 Nginx 根据 cache-control headers 从上游应用服务器自动清除?
在研究了这个问题之后,我发现它没有很好的记录,因为大多数人似乎都关心 CMS,在 CMS 中很容易说 "cache articles for a day",但对于动态应用程序服务器则不然,因为每个请求可能会有所不同。
几个选项是:
- Nginx Plus
- Ngx Cache Purge module,虽然2年没更新了
- 定义多个具有不同到期时间的缓存,并在可能的情况下按路径以不同方式应用它们。
- 忘记在 Nginx 上缓存,在它前面放一个像 Varnish 这样的服务器。
更新:进一步看,我现在认为 proxy_cache_valid 甚至不需要存在。如果没有来自上游的 cache-control/expiry,它只是设置一个默认的到期时间。如果没有 proxy_cache_valid,Nginx 仍会将内容视为陈旧内容,但不会立即清除。它在缓存中保留陈旧内容的原因(由 "inactive" 参数和可选的 proxy_cache_valid 确定)是它可以使用 proxy_cache_use_stale 提供陈旧内容(如果上游有错误则很有用)。
Nginx 可以缓存内容,即充当 reverse-proxy,但清除时间必须在 Nginx 配置中固定。
有没有办法让 Nginx 根据 cache-control headers 从上游应用服务器自动清除?
在研究了这个问题之后,我发现它没有很好的记录,因为大多数人似乎都关心 CMS,在 CMS 中很容易说 "cache articles for a day",但对于动态应用程序服务器则不然,因为每个请求可能会有所不同。
几个选项是:
- Nginx Plus
- Ngx Cache Purge module,虽然2年没更新了
- 定义多个具有不同到期时间的缓存,并在可能的情况下按路径以不同方式应用它们。
- 忘记在 Nginx 上缓存,在它前面放一个像 Varnish 这样的服务器。
更新:进一步看,我现在认为 proxy_cache_valid 甚至不需要存在。如果没有来自上游的 cache-control/expiry,它只是设置一个默认的到期时间。如果没有 proxy_cache_valid,Nginx 仍会将内容视为陈旧内容,但不会立即清除。它在缓存中保留陈旧内容的原因(由 "inactive" 参数和可选的 proxy_cache_valid 确定)是它可以使用 proxy_cache_use_stale 提供陈旧内容(如果上游有错误则很有用)。