![NGINX 无法通过 proxy_cache_background_update 提供“快速”陈旧内容](https://linux22.com/image/734379/NGINX%20%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%20proxy_cache_background_update%20%E6%8F%90%E4%BE%9B%E2%80%9C%E5%BF%AB%E9%80%9F%E2%80%9D%E9%99%88%E6%97%A7%E5%86%85%E5%AE%B9.png)
我们在后端服务器前运行 NGINX。
我们正在尝试启用proxy_cache_background_update该功能允许 NGINX 异步更新缓存并在执行此操作时提供陈旧的内容。
然而,我们注意到它仍然缓慢地提供陈旧的内容,就好像它不是从缓存中提供的一样。项目过期后所花的时间非常慢,显然不是从缓存中提供的 - 您可以知道它正在转到后端服务器,获取更新并将其传递给客户端。
以下是 NGINX 的配置:
proxy_cache_revalidate on;
proxy_ignore_headers Expires;
proxy_cache_background_update on;
我们的后端服务器正在提供以下标头:
HTTP/1.1 200 OK
Date: Thu, 28 Feb 2019 21:07:09 GMT
Server: Apache
Cache-Control: max-age=1800, stale-while-revalidate=604800
Content-Type: text/html; charset=UTF-8
当尝试获取过期的页面时,我们注意到以下标头:
X-Cache: STALE
但是,提供此响应时速度非常慢,就好像它联系了后端服务器并实时完成一样。
NGINX 版本:
$ nginx -v
nginx version: nginx/1.15.9
非常感谢任何建议、提示和配置更改。
更新
看来 nginx 服务器尊敬提供过时的内容(正如我们测试过的),但它也会在同一个请求/线程上从后端更新缓存,从而导致客户端的响应时间变慢。也就是说,它似乎完全忽略了指令,proxy_cache_background_update on;
并没有在后台通过单独的子请求(异步)进行更新。
答案1
答案2
我可以通过keepalive_timeout 0;
在位置块中添加来解决这个问题。
答案3
我觉得你错过了proxy_cache_use_stale updating;
从该参数的文档中:
updating
如果当前正在更新,则该参数允许使用陈旧的缓存响应。
他们这样proxy_cache_background_update
说:
请注意,在更新时,必须允许使用过时的缓存响应。
这就是proxy_cache_use_stale updating;
正在做的事情。