我试图更好地理解nginx缓存,特别是与keys_zone设置相关的功能。
文件说明如下:
请注意,keys_zone参数定义的大小并不限制缓存响应数据的总量。缓存的响应本身与元数据的副本一起存储在文件系统上的特定文件中。
缓存文件的数量是否受到keys_zone设置中的大小设置的限制?(一兆字节的keys_zone意味着缓存的文件最多不超过8,000个?)
我还想了解重新启动nginx进程对缓存的影响。keys_zone数据是持久化的,还是不需要持久化(因为相关信息也存储在缓存中的文件中)?
重新启动nginx进程有效地清除缓存吗?(看上去不像,但我想确认一下)
keys_zone中指定的大小是与每个缓存文件关联的元数据的内存中缓存的大小(其中缓存丢失从相关文件读取),还是缓存中哪些文件在缓存中而哪些不在缓存中的权威列表?
任何有助于更好地理解这一设置的效果的信息将被感谢,谢谢。
发布于 2020-08-13 20:22:47
查看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请求处理流程示例:
GET /example请求并计算缓存密钥。此外,还有以下情况的其他流程:
希望这能回答你的问题。
发布于 2020-12-21 13:32:46
根据我的经验,nginx根据keys_zone大小限制缓存的文件总数。
一个1兆字节的keys_zone意味着最多不能缓存8,000个文件?
我在观察这种行为。我试图将keys_zone值更改为20k,并获得了55个最大缓存文件的上限。
由于其他条件,仍然有可能对文件进行修剪,但是还有另一个答案(https://serverfault.com/a/754397/607386)指出这个限制也存在。
在Windows 10操作系统上,我的nginx版本是1.18.0
https://serverfault.com/questions/1029358
复制相似问题