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()函数。这个函数很简单,就是检查缓存队列,看里面的索引信息有没有过期,如果过期,就把缓存的文件从磁盘删掉,并把索引从内存中释放。
static time_t ngx_http_file_cache_manager(void *data){ngx_http_file_cache_t *cache = data;//先删过期的缓存next = ngx_http_file_cache_expire(cache); for ( ;; ) {//获取最更新的缓存空间的大小ngx_shmtx_lock(&cache->shpool->mutex);size = cache->sh->size;ngx_shmtx_unlock(&cache->shpool->mutex);//如果空间在指定范围内,不用再删了。return//...//如果size超过磁盘的使用空间,即size >= cache->max_size//强制把部分缓存删除,以保证缓存使用的空间在指定范围内next = ngx_http_file_cache_forced_expire(cache);//休息一下以后继续删//...}}
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文件系统的路径。如:
在解析配置文件的时候,"proxy_cache_path"指令的set()函数是ngx_http_file_cache_set_slot()。
- Nginx Proxy Cache分析
- Nginx Proxy Cache分析
- Nginx Proxy Cache分析
- nginx proxy cache 缓存 流程
- How To use nginx proxy cache replace squid
- 利用Proxy Cache使Nginx对静态资源进行缓存
- Nginx Proxy Cache的slab page内存缓存机制
- 利用Proxy Cache使Nginx对静态资源进行缓存
- 利用Proxy Cache使Nginx对静态资源进行缓存
- nginx配置Proxy Cache缓存的12个指令
- nginx -cache loader process 进程分析
- nginx -cache loader process进程分析
- Nginx-cache manager process进程分析
- 【nginx】-cache loader process进程分析
- Nginx Proxy cache + Perl + ImageMagick 做Wap站图片适配 实时压缩
- nginx cache
- nginx对静态文件cache的处理分析
- nginx对静态文件cache的处理分析
- 贪寄傻瀑貌勇谡松鲜敢欢谫壁锌迪
- 写给准备参加秋招的学弟学妹们~一定要来看哦~
- IOS开发的哪些异常之异常断点
- 《Advanced Windows Debugging》学习笔记
- git 初级使用记录
- Nginx Proxy Cache分析
- 承载(Host)通用语言运行时
- 编写高效的C++程序方法之使用对象池
- LeetCode刷题笔录 Pascal's Triangle
- 软件开发是瓜熟蒂落,不能强迫
- 山东理工ACM【2554】冒泡排序中数据交换的次数
- JAVA文件上传工具类
- 两相异正数的等差中项和等比中项
- 安卓webview和js+html交互利用的addJavascriptInterface和webview.loadUrl("javascript:**");