开启反代的缓存后,把部分接口请求也缓存了,故障查了大半天。
反代开启缓存后的原文配置
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。
无论怎么说,从功能设计的公允性上来说,我认为是不能轻易覆盖上游配置缓存配置的,毕竟这是个很敏感的字段。开关关闭时,不加这个字段更为合理。
我也是阿里云cdn 遇到这个问题了, 坑死啊 , 所有get请求给我缓存了
最新版本已经优化了 可以在主配置文件删除 proxy_cache proxy_cache_panel;
WTF
8
之前CDN一直没有正确处理 Cache-Control
,排查半天发现是1Panel的问题,这个必选是否缓存太恶心人了啊
WTF
9
请问下这个在哪里,我反代的后端有配置缓存配置头,每次新建或者修改反代配置都会加2条缓存头,需要专门去源文中把它删了