Skip to content

[Bug] The reverse proxy cache feature settings are ambiguous, and there is an error in the configuration location for cache duration. #9904

@HynoR

Description

@HynoR

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 分钟/小时等...

测试结果

命中缓存的动态内容:
Image

图片静态资源:
Image


Steps to Reproduce

启用缓存功能。

造成的缓存现状

  1. 应用数据 → OpenResty(固定10m有效期的Nginx缓存内容) → Browser(no-cache)

    • 无论是什么用户请求,首次请求接口如果是 200,下次请求永远是 nginx 返回的缓存数据
    • 直到缓存过期前,nginx 不会代理用户请求的应用数据
  2. 静态资源 → OpenResty(固定10m有效期的Nginx缓存内容) → Browser(cache x m)


The expected correct result

缓存时间选项直接同时控制 expireproxy_cache,或者分离让用户自己配置,如浏览器缓存时间、服务端缓存时间等,并移除 url 判断是否是静态资源。
如下面示例,可以用两个反向代理配置来实现缓存静态资源和其余维持动态,或者自己手动配置规则来缓存所需文件。

参考个人用于生产环境的配置示例(图片缓存 1d,其余动态):

Image Image

静态资源后缀也应该更新,jpegsvgwebpavif 这些静态资源也是目前开始流行或者已经广泛使用的静态资源格式,字节、b 站、腾讯网站都有很多这些格式的图片。


Related log output

Additional Information

No response

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions