Nginx 的 open_file_cache 相关配置能够缓存静态文件的元信息,在这些静态文件被频繁访问时能够显着提高性能。nginx
被缓存的文件元信息包括:缓存
这里有个配置示例:socket
open_file_cache max=64 inactive=30d; open_file_cache_min_uses 8; open_file_cache_valid 3m;
max=64
表示设置缓存文件的最大数目为 64, 超过此数字后 Nginx 将按照 LRU 原则丢弃冷数据。性能
inactive=30d
与 open_file_cache_min_uses 8
表示若是在 30 天内某文件被访问的次数低于 8 次,那就将它从缓存中删除。spa
open_file_cache_valid 3m
表示每 3 分钟检查一次缓存中的文件元信息是不是最新的,若是不是则更新之。code
这个问题的关键是 sendfile(2).it
Nginx 在 serve 静态文件的时候用的是 sendfile(2), 固然前提是你配置了 sendfile on
, sendfile(2) 直接在 kernel space 内传输数据,对比使用 read(2)/write(2) 省去了两次 kernel space 与 user space 之间的数据拷贝。而同时这些被频繁读取的静态文件的内容会被 OS 缓存到 kernel space。在这样的机制下,咱们缓存中有文件的 fd 和 size,直接调用 sendfile(2) 就能够了。io
若是要 Nginx 连内容一块儿缓存,那就须要每次文件变化都要用 read(2) 将数据从 kernel space 复制到 user space,而后放在 user space,每次应答请求的时候再从 user space 复制到 kernel space 而后写入 socket。比起前面的方式,这样的方式毫无优势。ast
上面提到的配置中,30 天无访问丢弃,每 3 分钟作一次信息有效性监测,咱们暂且把 3 分钟叫作缓存更新周期。那在这 3 分钟以内文件发生变化了会怎样呢?class
因为 nginx 还持有原文件的 fd,因此你删除此文件后,文件并不会真正消失, client 仍是能经过原路径访问此文件。即使你删除后又新建了一个同名文件,在当前缓存更新周期内能访问到的仍是原文件的内容。
文件内容被修改能够分为两种状况:
open_file_cache_valid
设置的小一些,以便及时检测和更新。