我正在尝试更好地了解 nginx 缓存,特别是与设置相关的功能keys_zone
。
文档说明如下:
请注意,keys_zone 参数定义的大小不会限制缓存响应数据的总量。缓存响应本身与元数据副本一起存储在文件系统上的特定文件中。
缓存文件的数量是否受keys_zone
设置中设置的大小限制?(一兆字节keys_zone
意味着不能缓存超过8,000个文件?)
我还想了解重新启动 nginx 进程对缓存有何影响。keys_zone
数据是否持久化,或者是否不需要持久化(因为相关信息也存储在缓存中的文件中)?
重新启动 nginx 进程是否能有效清除缓存?(似乎不行,但我希望确认一下)
设置中指定的大小是keys_zone
与每个缓存文件相关的元数据的内存缓存的大小(从相关文件读取缓存未命中),还是哪些文件在缓存中以及哪些不在缓存中的权威列表?
如果能提供任何有助于更好地理解此设置的效果的信息,我们将不胜感激。
答案1
查看 nginx 源代码,src/http/ngx_http_file_cache.c
我的解释是keys_zone
指定缓存文件元数据的内存缓存。
的大小keys_zone
指定缓存大小,并且在这种情况下,它限制缓存文件的活动缓存元数据条目的数量。
有一个名为的清理函数,它从元数据内存缓存和实际文件缓存中删除特定条目。我没有清楚地看到在清理过程中选择要释放的条目的算法是什么。
文件系统上没有存储缓存文件的列表。
当 nginx 尝试检查文件是否被缓存时,它首先检查元数据缓存中是否存在该请求的元数据条目。如果存在,它会打开该文件并从该文件发送缓存请求。
当没有找到元数据条目时,nginx 将检查文件系统上是否存在与缓存键相对应的文件,然后从中读取元数据和实际的缓存响应。
缓存文件的数量是否受 keys_zone 设置中设置的大小限制?(一兆字节的 keys_zone 意味着不能缓存超过 8,000 个文件?)
不,它不限于该大小。如果在缓存中找不到元数据,nginx 将查找缓存文件。
我还想了解重新启动 nginx 进程对缓存有何影响。keys_zone 数据是否持久化,还是不需要持久化(因为相关信息也存储在缓存中的文件中)?
nginx 重启后,元数据缓存会被清理。当请求到达 Web 服务器时,它会根据缓存文件中的元数据进行构建。
重新启动 nginx 进程是否能有效清除缓存?(似乎不行,但我希望确认一下)
不是,实际的缓存内容仍保留在文件系统中,并且重启后仍使用缓存内容(前提是内容根据缓存标准仍然有效)。
keys_zone 设置中指定的大小是否是与每个缓存文件相关的元数据的内存缓存的大小(从相关文件读取缓存未命中),或者它是否是哪些文件在缓存中以及哪些文件不在缓存中的权威列表?
您的第一个替代方案准确地描述了其功能。
nginx 缓存/元数据缓存的工作方式与通常的缓存类似。如果找不到请求的数据,则从下一层源获取。
非缓存资源的HTTP请求处理流程示例:
- nginx接收
GET /example
请求并计算缓存键。 - nginx 使用密钥查找请求的元数据缓存条目。该条目不存在。
- nginx 检查文件缓存,如果缓存键对应的文件存在,则不存在缓存文件。
- nginx 将请求发送至上游。
- 如果响应可缓存,nginx 会将响应保存到缓存并创建元数据缓存条目。
然后还有以下情况的其他流程:
- 文件缓存中的缓存响应 + 元数据缓存中的元数据条目
- 文件缓存中的缓存响应 + 元数据缓存中没有元数据条目
- 文件缓存中没有缓存响应 + 元数据缓存中没有元数据条目(如果从缓存目录中删除文件就会发生这种情况)
希望这能回答你的问题。
答案2
根据我的经验,nginx 根据 keys_zone 大小限制缓存的文件总数。
一兆字节的 keys_zone 意味着最多可以缓存 8,000 个文件?
我正在观察这种行为。我尝试将 keys_zone 值更改为 20k,并获得了 55 个最大缓存文件的限制。
由于其他一些情况,文件仍然有可能被修剪,但还有另一个答案(https://serverfault.com/a/754397/607386) 指出这个限制也存在。
我的 Windows 10 操作系统上的 nginx 版本是 1.18.0