本文主要对nginx的cache loader process 进程进行分析,并进行记录。
事实真相:
在nginx启动1分钟之后,会启动一个名为cache loader process的进程,该进程运行了一段时间之后,该进程就会结束消失。
在该进程运行期间主要做了以下事情:遍历配置文件中proxy_cache_path命令指定的路径中的所有的缓存文件,并且针对遍历到的各个缓存文件的MD5编码先遍历红黑树和相应的ngx_http_file_cache_node_t节点,如果不存在就创建新的ngx_http_file_cache_node_t,并将该对象中的rbnode和queue分别插入到红黑树和过期队列;如果存在,则更新相应的属性。
通过上述操作,完成根据缓存文件进行索引数据的重建工作。
下面对该过程进行详细研究:
1. 结构先行
保存了当前cache的一些信息,包含manager和loader函数指针和传入数据地址
(1) ngx_path_t;
typedef struct {
ngx_str_t name;
size_t len;
size_t level[3];
ngx_path_manager_pt manager;
ngx_path_loader_pt loader; //cache loader的函数指针,在运行cache loader进程的时候通过该函数完成索引元数据的重建
void *data;
u_char *conf_file;
ngx_uint_t line;
} ngx_path_t;
一个缓存数据对应一个ngx_http_file_cache_node_t结构
typedef struct {
ngx_rbtree_node_t node;//缓存文件对应的红黑树节点
ngx_queue_t queue;//队列
//cache_key 12位=16位cache_key-4位rbt_key
u_char key[NGX_HTTP_CACHE_KEY_LEN
-sizeof(ngx_rbtree_key_t)];
unsigned count:20; //引用计数
unsigned uses:10;//多少请求在使用
unsigned valid_msec:10;
unsigned error:10;//状态
unsigned exists:1;//是否存在对应的cache文件
unsigned updating:1;//是否在更新
/* 12unused bits */
ngx_file_uniq_t uniq;//文件的uniq
time_t expire;//失效时间
time_t valid_sec;//max-age?