Nginx Proxy Cache分析

来源:互联网 发布:淘宝 单行本 小椋ムク 编辑:程序博客网 时间:2024/05/16 12:26

原文连接:http://bollaxu.iteye.com/blog/888748

 

        本文从几个部分来详细介绍Nginx的proxy cache功能。第一部分,主要介绍proxy cache的过期、空间管理等。第二部分,主要介绍在Nginx(作为反向代理服务器)收到请求之后,如何检查本地的缓存来确定是否要向后端服务器发起请求。第三部分,主要介绍Nginx向后端服务器发起请求并收到回复的情况下,如何把响应回复缓存到本地。

 

第一部分

        在Nginx中,如果启用了proxy cache功能,master process会在启动的时候启动管理缓存的两个子进程(区别于处理请求的子进程)来管理内存和磁盘的缓存个体。第一个进程的功能是定期检查缓存,并将过期的缓存删除;第二个进程的作用是在启动的时候将磁盘中已经缓存的个体映射到内存中(目前Nginx设定为启动以后60秒),然后退出。


        具体的,在这两个进程的ngx_process_events_and_timers()函数中,会调用ngx_event_expire_timers()。Nginx的ngx_event_timer_rbtree(红黑树)里面按照执行的时间的先后存放着一系列的事件。每次取执行时间最早的事件,如果当前时间已经到了应该执行该事件,就会调用事件的handler。两个进程的handler分别是ngx_cache_manager_process_handler和ngx_cache_loader_process_handler。因为ngx_process_events_and_timers()是被循环调用的,所以上面两个handler也会被调用多次。

 

1. ngx_cache_manager_process_handler

        这个函数调用了每个磁盘缓存路径对应的manager()函数,即ngx_http_file_cache_manager()函数。这个函数很简单,就是检查缓存队列,看里面的索引信息有没有过期,如果过期,就把缓存的文件从磁盘删掉,并把索引从内存中释放。

 
 

2. ngx_cache_loader_process_handler

        这个函数跟ngx_cache_manager_process_handler差不多,不过在里面调用了对应路径的loader()函数,即ngx_http_file_cache_loader()。这个函数的作用是给磁盘缓存路径下面子路径下面的所有缓存文件建立内存索引,并根据文件名得到key来插入红黑树,并放入过期删除队列。

  

第二部分

        在http的请求发送给有proxy_cache和proxy_pass定义的location的时候,会调用到ngx_http_proxy_handler()。其中在决定是否要向后端发送请求的时候,先检查一下本地是否有缓存一个copy。具体的位置是在ngx_http_upstream_init_request()函数的一开始,在发起向后的连接之前。

 

第三部分

        在Nginx收到后端服务器的响应之后,会把这个响应发回给用户。而如果缓存功能启用的话,Nginx就会把响应存入磁盘里。

 

 

附:proxy cache的配置、set()函数和初始化函数

        在Nginx配置文件里面设置proxy_cache_path指令,指定缓存内存的大小和在disk文件系统的路径。如:

Nginx config: 

在解析配置文件的时候,"proxy_cache_path"指令的set()函数是ngx_http_file_cache_set_slot()。

 
在cycle初始化的时候,会初始化内存索引的空间,代码如下:

 

 

0 0
原创粉丝点击