Contact Information
No response
1Panel Version
2.0.7
Problem Description
看到 #9900 提出的 issue 做测试发现的问题。
当启用缓存的时候,使用的是此缓存设置:
if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ) {
expires 1m; # 控制用户浏览器缓存多久,面板修改位置
}
proxy_ignore_headers Set-Cookie Cache-Control expires;
proxy_cache proxy_cache_zone_of_test.com;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 304 301 302 10m; # 控制 nginx 缓存多久, 固定 10 分钟不变
个人猜测缓存功能是为了在用户反代应用时,启用缓存后有缓存静态资源的功能。
实际反向代理中,这是两个不同的缓存控制
expires: 是返回给用户的 cache control 头部,告知用户浏览器缓存多久资源而不从服务器拉取
proxy_cache_valid: 代表当nginx反代目的地请求成功后,nginx会缓存数据, 这个值控制nginx本地缓存数据内容的有效时间,下次用户访问的时候不会从目的地拉取而是从 nginx 缓存返回给用户。
实际影响
修改时间只会对返回静态资源的 cache control 头的时间有影响,而不是真正的对 nginx 缓存功能时间做出了修改。
最终这段容易误导的配置会让 nginx 缓存所有内容 10m,并且只对静态资源加上缓存头,告知用户缓存 x 分钟/小时等...
测试结果
命中缓存的动态内容:

图片静态资源:

Steps to Reproduce
启用缓存功能。
造成的缓存现状
-
应用数据 → OpenResty(固定10m有效期的Nginx缓存内容) → Browser(no-cache)
- 无论是什么用户请求,首次请求接口如果是 200,下次请求永远是 nginx 返回的缓存数据
- 直到缓存过期前,nginx 不会代理用户请求的应用数据
-
静态资源 → OpenResty(固定10m有效期的Nginx缓存内容) → Browser(cache x m)
The expected correct result
缓存时间选项直接同时控制 expire 和 proxy_cache,或者分离让用户自己配置,如浏览器缓存时间、服务端缓存时间等,并移除 url 判断是否是静态资源。
如下面示例,可以用两个反向代理配置来实现缓存静态资源和其余维持动态,或者自己手动配置规则来缓存所需文件。
参考个人用于生产环境的配置示例(图片缓存 1d,其余动态):
静态资源后缀也应该更新,jpeg、svg、webp、avif 这些静态资源也是目前开始流行或者已经广泛使用的静态资源格式,字节、b 站、腾讯网站都有很多这些格式的图片。
Related log output
Additional Information
No response