我们都知道nginx可以针对不同的状态码进行缓存时间的调整,最近我就遇到这样的一起问题,一个客户后端只有一个WEB节点,由于网络波动的原因,造成后端向NGINX返回了500错误。此时NGINX对500缓存了,时长为10分钟。这期间再有用户访问这个页面时就不会再向源站发起请求了,而是直接返回缓存数据,即500错误页。
proxy_cache_valid #设置不同的状态码的缓存时长。
例如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1m;
针对某个状态也可以设置为0m;
当如果有多个后端节点时也可以使用其他节点的数据返回给用户,当某节点收到5XX错误信息时。
proxy_next_upstream error timeout http_500 non_idemponent;
proxy_next_upstream_timeout 6s;
proxy_next_upstream_tries 2
绕开缓存
// 请求中有下面参数值时不走缓存
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
这里再引入一个概念,当源站发生了错误不能向客户提供服务时,我们也可以考虑使用旧的缓存返回给用户。
proxy_cache_use_stale #增强站点容错能力
源站有问题时,nginx可以通过proxy_cache_use_stale
指令开启容错能力,即使用缓存内容来响应客户端的请求。举例如下:
location / {
...
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}
如上配置表示,当作为cache的NGINX收到源站返回error、timeout或者其他指定的5XX错误,并且在其缓存中有请求文件的陈旧版本,则会将这些陈旧版本的文件而不是错误信息发送给客户端。