core/ngx_open_file_cache.h头文件分析
本节主要讲述一下nginx对静态文件的缓存相关操作。
1. directio_off宏定义
在objs/ngx_auto_config.h头文件中,有如下定义:
#ifndef NGX_MAX_OFF_T_VALUE #define NGX_MAX_OFF_T_VALUE 9223372036854775807LL #endif
这里定义NGX_OPEN_FILE_DIRECTIO_OFF
为long long的最大值,一般文件大小都不会超过此值,因此可以将此值作为directio_off
来用。
2. ngx_open_file_info_t数据结构
ngx_open_file_info_t
用于nginx中描述一个打开的缓存文件, 下面我们简要分析一下各字段的含义:
-
fd
: 该文件所对应的文件句柄 -
uniq
: 该文件所对应的全局唯一标识, 一般取值为inode节点号 -
mtime
: 该文件的最后修改时间 -
size
: 该文件的大小 -
fs_size
: 该文件所占用的硬盘层面的块数block * 512
这里关于size与fs_size的区别,简单说明一下。 首先执行如下命令:
这里求fs_size一般采用如下宏:
#define ngx_file_fs_size(sb) ngx_max((sb)->st_size, (sb)->st_blocks * 512)
一般在文件有hole
的情况下, 文件的size
大于fs_size
, 否则fs_size
小于等于size
。
-
directio
: 文件对应的directio大小值, 小于该值采用sendfile来发送, 大于该值采用aio来发送, 这样可以防止进程被阻塞。 -
read_ahead
: 预先由内核读取的字节数。关于read_ahead, 有如下一段说明:
Syntax: read_ahead size; Default: read_ahead 0; Context: http, server, location Sets the amount of pre-reading for the kernel when working with file. On Linux, the posix_fadvise(0, 0, 0, POSIX_FADV_SEQUENTIAL) system call is used, and so the size parameter is ignored. On FreeBSD, the fcntl(O_READAHEAD, size) system call, supported since FreeBSD 9.0-CURRENT, is used. FreeBSD 7 has to be patched.
-
err
: 该打开的文件所关联的错误信息码 -
failed
: 所关联的错误信息 -
valid
: 文件的有效时间 -
min_uses
: 本字段牵扯到open_file_cache
指令,指令中inactive参数时间内文件的最少访问次数,如果超过这个数字,该打开的文件描述符将会一直
关于disable_symlinks_from
与disable_symlinks
字段,主要用于决定当打开文件的时候如何处理符号链接(symbolic links)。其中前一个字段用于指定从哪一个字段开始检查符号链接, 而后一个字段用于指定是否禁止符号链接。在objs/ngx_auto_config.h
头文件中有如下定义:
#ifndef NGX_HAVE_OPENAT #define NGX_HAVE_OPENAT 1 #endif
-
test_dir
: 有时可能在程序运行过程中,一个directory变成了一个file, 通过此字段控制是否需要再进行dir的检测 -
test_only
: 只用于测试nginx中某一个特定的文件,以了解相关信息,并不会真正把其放入到nginx的静态文件cache中 -
log
: 本字段当前主要用于指示是否只以非阻塞只读
方式打开一个文件 -
errors
: 主要用于指示当操作缓存文件出现错误时,如何处理。 当此字段为0, 则出现错误时返回失败; 当此字段为1, 则出现错误时可能
会进行重建操作。本字段主要用于指示是否能够忍受errors -
events
: 主要用于指示是否为打开的文件绑定相应的事件。在有些操作系统上如删除文件等都会产生相应的事件 -
is_dir
: 用于指示此文件是否是一个目录 -
is_file
: 用于指示此文件是否是一个普通的文件 -
is_link
: 用于指示此文件是否是一个链接文件 -
is_exec
: 用于支持此文件是否是一个可执行文件 -
is_directio
: 主要用于指示此文件是否已经开启了directio
2. ngx_cached_open_file_t数据结构
本数据结构用于表示一个需要被cached
的打开文件。下面我们简要介绍一下该数据结构:
-
node
: 用于表示该ngx_cached_open_file_s结构在nginx静态缓存红黑树的哪一个节点上 -
queue
: 用于表示该ngx_cached_open_file_s结构所在的队列 -
name
: 用于表示该缓冲的文件的名称 -
created
: 用于指明该文件是最先是在什么时候被放入静态缓存的 -
accessed
: 用于指示该缓存文件最近访问时间 -
fd
: 该缓存文件的文件句柄 -
uniq
: 该缓存文件的inode节点号,用作唯一标识 -
mtime
: 对该缓存文件的最近更新时间 -
uses
: 当前该缓存文件自从被添加到缓存红黑树之后被使用到的次数
关于disable_symlinks_from
与disable_symlinks
字段,主要用于决定当打开文件的时候如何处理符号链接(symbolic links)。其中前一个字段用于指定从哪一个字段开始检查符号链接, 而后一个字段用于指定是否禁止符号链接。在objs/ngx_auto_config.h
头文件中有如下定义:
#ifndef NGX_HAVE_OPENAT #define NGX_HAVE_OPENAT 1 #endif
-
count
: 是文件的引用计数,表示现在文件被几个请求使用中 -
close
: 用于指示是否需要真正被关闭 -
use_event
: 指示是否使用event -
is_dir
: 用于指示此文件是否是一个目录 -
is_file
: 用于指示此文件是否是一个普通的文件 -
is_link
: 用于指示此文件是否是一个链接文件 -
is_exec
: 用于支持此文件是否是一个可执行文件 -
is_directio
: 主要用于指示此文件是否已经开启了directio -
event
: 该打开的缓存文件所关联的事件
注意:
结构体ngx_open_file_info_t与ngx_cached_open_file_t的不同主要表现在:前者用于描述一个打开 的缓存文件;而后者用于描述一个需要打开的缓冲文件,因此其要存储文件名等相关信息。
3. ngx_open_file_cache_t结构
本结构用于缓存nginx中的静态文件。下面简要介绍一下本数据结构:
-
rbtree
: 缓存文件红黑树的根,主要是为了方便查找 -
sentinel
: 红黑树sentinel节点 -
expire_queue
: 缓存文件过期队列 -
current
: 当前缓存元素的个数 -
max
: 最大的缓存个数 -
inactive
: 缓存的过期时间
4. ngx_open_file_cache_cleanup_t结构
本数据结构指示当前要清除的缓存文件结构。下面我们简要介绍一下各字段的含义:
-
cache
: 用于指示当前要cleanup的cache -
file
: 用于指示当前要cleanup的文件 -
min_uses
: 低于此值则会cleanup -
log
: 所对应的日志
5. ngx_open_file_cache_event_t结构
本数据结构用于指示nginx静态缓存所对应的事件。下面简要介绍一下各字段的含义:
-
data
: 可以是任何内容 -
read
: 读事件 -
write
: 写事件 -
fd
: 所关联的文件句柄 -
file
: 所关联的静态缓冲文件 -
cache
: 所关联的缓存
6. 相关函数声明
[参看]