nginx proxy cache 缓存 流程

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 void
ngx_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 void
ngx_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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值