理解 nginx proxy_cache_path 指令

Jür*_*aul 36 configuration nginx

假设我有这个 nginx 配置文件

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
Run Code Online (Sandbox Code Playgroud)
  • 这是什么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;
    
    Run Code Online (Sandbox Code Playgroud)

谢谢!

mas*_*oeh 45

keys_zone=myCache:8m 是什么意思?

正如文档所说,nginx 会将所有活动密钥和有关数据的信息存储在共享内存区域中,其namesize由 keys_zone 参数配置。为了完整起见,让我们分解每个部分

  • /var/cache/nginx是实际缓存存储的地方。在文件夹内,缓存文件是二进制文件,但您可以很容易地发现其中的 html 标签。
  • levels=1:2 是级别参数设置缓存中的子目录级别数。
  • keys_zone=myCache:8m正在定义名为 myCache 的共享内存区域,最大大小为 8 MB。它保存缓存的所有活动键和元数据。因此,每当 nginx 检查页面是否被缓存时,它首先查询共享内存区域,然后在/var/cache/nginx缓存存在的情况下查找实际缓存的位置。
  • max_size是缓存的最大大小,例如文件大小/var/cache/nginx
  • inactive=1h指定缓存可以存储的最大非活动时间。在inactive参数指定的时间内未访问的缓存数据会从缓存中删除,而不管它们的新鲜度如何。

缓存验证和删除的工作原理

取自nginx 邮件列表

  • 指令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
Run Code Online (Sandbox Code Playgroud)

在其他进程中,缓存管理器执行此逻辑

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size
Run Code Online (Sandbox Code Playgroud)

如果proxy_cache_valid(12h) 高于proxy_cache_path 中指定的非活动值(1h) 怎么办?

只要请求并访问了特定的缓存,该缓存对象将在该对象放入缓存后的 12 小时内仍然有效。之后,缓存被认为是无效的,因此 nginx 将从后端获取并重置有效计时器。但是如果对象处于非活动状态(未访问)超过一小时 - 即使在 12 小时有效缓存期间 - nginx 会因为参数而将其删除inactive

  • @SunilD。- 给你:http://nginx.org/en/docs/syntax.html (5认同)