nginx proxy cache 缓存 流程

来源:互联网 发布:mac mini macbook air 编辑:程序博客网 时间:2024/06/05 06:26

1.向客户端响应时,查询本地是否有缓存

ngx_http_upstream_init_request--->ngx_http_upstream_cache-->ngx_http_file_cache_open--->ngx_http_upstream_cache_send--->ngx_http_cache_send

可以参考http://blog.itpub.net/15480802/viewspace-1421409/


2.从上游获取到数据后,缓存到本地

主要是在ngx_event_pipe-->ngx_event_pipe_write_to_downstream这个函数中完成,如果判断是可缓存的,发送给客户端后,再调用ngx_write_chain_to_temp_file写入临时文件,当数据获取完整时,将临时文件重新命名为缓存文件,重命名操作在ngx_http_upstream_process_request调用ngx_http_file_cache_update中完成


3.程序启动load

主要处理函数是ngx_http_file_cache_loader,


4.cache 管理

主要处理函数是ngx_http_file_cache_manager


以上两个接口是在读配置时,ngx_http_file_cache_set_slot函数中初始化


nginx启动时,调用ngx_start_cache_manager_processes启动缓存相关的load和 manager进程,进程处理函数为ngx_cache_manager_process_cycle

ngx_cache_manager_ctx_t对应的结构分别为ngx_cache_manager_ctx、ngx_cache_loader_ctx,ngx_cache_manager_process_cycle中执行ev.handler = ctx->handler,就是将ngx_cache_manager_ctx-->ngx_cache_loader_process_handler、ngx_cache_loader_ctx--->ngx_cache_manager_process_handler分别赋值给事件handler,使用定时器来触发事件,下面是两个handler的代码


static voidngx_cache_manager_process_handler(ngx_event_t *ev){    time_t        next, n;    ngx_uint_t    i;    ngx_path_t  **path;    next = 60 * 60;    path = ngx_cycle->pathes.elts;    for (i = 0; i < ngx_cycle->pathes.nelts; i++) {        if (path[i]->manager) {            /*调用ngx_http_file_cache_manager*/            n = path[i]->manager(path[i]->data);            next = (n <= next) ? n : next;            ngx_time_update();        }    }    if (next == 0) {        next = 1;    }    ngx_add_timer(ev, next * 1000);}

static voidngx_cache_loader_process_handler(ngx_event_t *ev){    ngx_uint_t     i;    ngx_path_t   **path;    ngx_cycle_t   *cycle;    cycle = (ngx_cycle_t *) ngx_cycle;    path = cycle->pathes.elts;    for (i = 0; i < cycle->pathes.nelts; i++) {        if (ngx_terminate || ngx_quit) {            break;        }        /*调用ngx_http_file_cache_loader*/        if (path[i]->loader) {            path[i]->loader(path[i]->data);            ngx_time_update();        }    }    exit(0);}




0 0
原创粉丝点击