反代缓存的默认配置存在巨大缺陷

开启反代的缓存后,把部分接口请求也缓存了,故障查了大半天。

反代开启缓存后的原文配置

location ^~ / {
    proxy_pass http://127.0.0.1:8880; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    proxy_ssl_server_name off; 
    proxy_ssl_name $proxy_host; 
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) {
        expires 1m; 
    }
    proxy_ignore_headers Set-Cookie Cache-Control expires; 
    proxy_cache proxy_cache_panel; 
    proxy_cache_key $host$uri$is_args$args; 
    proxy_cache_valid 200 304 301 302 10m; 
}

这是缓存命中标识,一开启缓存就出问题。
其实本意只是想对部分资源开启cache-control即可,但是没想到配置了所有资源的proxy_cache

部分接口缓存?部分接口不缓存?

对的,我没排查出差异在哪。
但是缓存开关设计的的确有非常大的缺陷,先操作开,再操作关,配置里就会增加2行

add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;

这绝对是非预期的行为,这2个header在反代层面不应该增加的,对业务影响性太大了,尤其是cache-control 是由上游控制的,前置可能还加了cdn,被反代强行一波控制全完了。

但是如果打开,又出现了上述问题,把所有请求都给缓存了,包括图片和接口。

这里的缓存配置可以参考下openrestry edge的控制面板,再好好设计优化一下把

这个是为了给客户端返回缓存命中状态的

这个也并不会完全不缓存 只有当资源完全没有更改的时候才会缓存

具体可以看一下 Nginx 的文档

我们的配置是要考虑绝大多数用户的 所以如果有具体的需求 可以编辑配置文件

add_header Cache-Control no-cache;

这个理论上说是给user-agent来决定如何对资源进行缓存的,可能是浏览器,也可能是前置的阿里云CDN,浏览器行为可能有个体差异(遵循etag之类的),但是单就阿里云CDN来说是会严格遵循 cache-control的行为来决定是否进行缓存,见 https://help.aliyun.com/zh/cdn/user-guide/add-a-cache-rule?spm=5176.11785003.console-base_help.dexternal.dc5a142ffhq0gl#section-qsg-cem-k22
无论怎么说,从功能设计的公允性上来说,我认为是不能轻易覆盖上游配置缓存配置的,毕竟这是个很敏感的字段。开关关闭时,不加这个字段更为合理。