假设我有这个 nginx 配置文件
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
- 这是什么
keys_zone=myCache:8m
意思?文档中没有太多关于它的说明:
此外,所有活动密钥和数据信息都存储在共享内存区域中,其名称和大小由keys_zone参数配置。
如果
proxy_cache_valid
(12h
) 高于 中的指定inactive
值 (1h
)会怎样proxy_cache_path
?它会遵循哪条规则?例如proxy_cache_valid 200 302 12h; proxy_cache_valid 404 302 1h;
谢谢!
答案1
keys_zone=myCache:8m 是什么意思?
作为文献中说,nginx 将继续所有活动密钥和数据信息均已存储在共享内存区域中,其name
和size
由keys_zone参数配置。为了完整性,让我们逐个部分进行分解
/var/cache/nginx
是实际存储缓存的地方。在该文件夹中,缓存文件是二进制文件,但您可以轻松发现其中的 html 标记。levels=1:2
levels参数设置缓存中的子目录级别数。keys_zone=myCache:8m
定义名为 myCache 的共享内存区域,最大大小为 8 MB。它保存所有活动键和元数据缓存。因此,每当 nginx 检查页面是否被缓存时,它都会首先查阅共享内存区域,然后查找实际缓存的位置(/var/cache/nginx
如果缓存存在)。max_size
是缓存的最大大小,例如文件大小/var/cache/nginx
。inactive=1h
指定缓存可以存储的最大非活动时间。在参数指定的时间内未访问的缓存数据inactive
将从缓存中删除,无论其新鲜度如何。
缓存验证和删除的工作原理
指示proxy_cache_valid指定响应在多长时间内被视为有效(并且将返回而不需要向后端发出任何请求)。在此时间之后,响应将被视为“过时”,并且不会返回,或者将取决于proxy_cache_use_stale环境。
争论不活跃的proxy_cache_path指定响应在最后一次使用后将在缓存中存储多长时间。请注意,如果有对它们的请求,即使是过时的响应也会被视为最近使用的。
据我了解,下面是 nginx 工作原理的伪代码
当请求到来时
if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
use it
else:
retrieve from backend
replace the old ones
在其他进程中,缓存管理器执行此逻辑
if (now() - cache.last_used) > inactive:
del cache
if all-cache.size > max-size:
del *the most inactive cache* until size < max-size
如果 proxy_cache_valid(12h) 高于 proxy_cache_path 中指定的非活动值 (1h) 会怎样?
只要请求并访问了特定缓存,该缓存对象在放入缓存后 12 小时内仍然有效。此后,缓存被视为无效,因此 nginx 将从后端获取并重置有效计时器。但如果对象处于非活动状态(未访问)超过一小时 - 即使在 12 小时有效缓存期内 - nginx 也会删除它因为inactive
参数。