nginx cache 学习总结

本文详细介绍了Nginx的缓存机制,包括基本指令如proxy_cache、proxy_cache_bypass、proxy_cache_key等,以及缓存相关结构体,如ngx_http_file_cache_s、ngx_http_file_cache_node_t等。还探讨了缓存管理器和加载器进程的工作原理,以及如何处理缓存文件的过期和删除。
摘要由CSDN通过智能技术生成

Nginx cache 学习总结

 

一、nginx cache的基本指令

1.1 proxy_cache 

 

syntax:

proxy_cache zone| off;

default:

proxy_cache off;

context:

http, server, location

定义一块共享内存区域用来进行缓存。相同名称的缓存区域可以在多个地方使用。Off参数关闭从前一个级别配置中继承下来的缓存设置

 

1.2 proxy_cache_bypass

 

yntax:

proxy_cache_bypass string…;

default:

context:

http, server, location

 定义一个条件,在这个条件成立后将不会从缓存中获取数据。至少有一个字符串参数不为空,并且是不等于“0”,则响应不会从缓存中获取。

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

 

proxy_cache_bypass $http_pragma    $http_authorization;

  

Can be used along with the proxy_no_cache directive.

  

1.3 proxy_cache_key

 

syntax:

proxy_cache_key string;

default:

proxy_cache_key $scheme$proxy_host$request_uri;

context:

http, server, location

给缓存数据定义一个键,例如

proxy_cache_key “$host$request_uri $cookie_user”;

默认情况下,该指令的值的字符串

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

  

1.4 proxy_cache_lock

 

syntax:

proxy_cache_lock on | off;

default:

proxy_cache_lock off;

context:

http, server, location

This directive appeared in version 1.1.12.

 

当指令被指定时,根据 proxy_cache_key指令确定的若干个或得出相同响应元素若干个请求仅仅有一个能被传递给后端的代理服务器(最终传递给应用服务器)去生成响应内容,生成后响应内容添加到cache中, 其他请求从cache中获取数据。其他请求将等待cache中有内容出现或者等待超时为止。

  

1.5 proxy_cache_lock_timeout

 

syntax:

proxy_cache_lock_timeout time;

default:

proxy_cache_lock_timeout 5s;

context:

http, server, location

This directive appeared in version 1.1.12.

 

proxy_cache_lock指令设置一个超时时间

 

  

1.6 proxy_cache_min_uses

 

syntax:

proxy_cache_min_uses number;

default:

proxy_cache_min_uses 1;

context:

http, server, location

 

设置请求发生多少次后,请求(响应内容)被缓存

  

1.7 proxy_cache_path

 

syntax:

proxy_cache_path path[levels=levels] keys_zone=name:size [inactive=time]

[max_size=size] [loader_files=number] [loader_sleep=time]

[loader_threshold=time];

default:

context:

http

 

设置高速缓存的路径和其他参数。缓存数据存储在文件中。在高速缓存中缓存内容文件名以及对应的key都用MD5函数处理。Levels参数确定缓存文件的层级关系。例如下面的配置文件

 

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

 

缓存后的文件名将如下:

 

/ data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

 

一个缓存的响应,首先被写入到一个临时文件,然后重命名一个文件。从版本0.8.9临时文件和缓存可以放在不同的文件系统,但在这种情况下,一个文件复制在两个文件系统中发生,而不是廉价的重命名操作。因此建议,对于任何给定的位置,缓存目录和proxy_temp_path指令所设定的临时文件都放在同一个文件系统中。

 

此外,所有活跃的数据信息包括其key都存储在一个共享内存区域中,这个区域的名称及大小等keys_zone指令的参数进行配置。被缓存在内存中的数据在一定时间没有被访问后将变成不活跃,这些数据将被从内存中移除无论数据是否还是有效,不活跃时间由inative 参数设置。默认情况下inactive是10分钟。

 

“高速缓存管理器”进程将监控max_size参数设置最大缓存大小,超过此大小时,它消除了最近最少使用的数据。

 

一分钟后开始的指定“cache loader”进程被激活,他将加载以前缓存在文件系统中的缓存数据到内存中。一个加载包括在若干个迭代过程。在一个迭代过程中加载文件数量小于loader_files 参数指定的数量(默认值100).除此以外迭代时间小于loader_threshold限制的值,默认值200毫秒。在两个迭代中间有个短暂的暂停(加载的暂停,nginx其他工作没有暂停),这个时间被loader_sleep参数所控制,默认值50毫秒。

 

1.8 proxy_cache_use_stale 

 

syntax:

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500

| http_502 | http_503 | http_504 | http_404 | off …;

default:

proxy_cache_use_stale off;

context:

http, server, location

 

如果nginx同代理服务器工作过程中发生一个错误,nginx可能使用一个陈旧的被缓存的数据。这个指令决定在那种情况下使用这个功能。这个指令的参数会同proxy_next_upstream指令的参数相匹配。

 

 此外,如果目前正在更新,更新参数允许使用过时的缓存的响应。这可以最大限度地减少更新缓存数据时,代理服务器的访问次数。

    为了尽量减少当填充一个新缓存元素时访问代理服务器次数过多的问题,可以使用proxy_cache_lock指令,来缓解。

 

1.9 proxy_cache_valid 

 

syntax:

proxy_cache_valid [code…] time;

default:

context:

http, server, location

 

设置不同响应代码的缓存时间,例如如下指令:

 

proxy_cache_valid 200 302   10m;

 

proxy_cache_valid 404       1m;

 

设置缓存的响应代码为200和302时间为10分钟,代码为404的响应缓存时间为1分钟。

 

如果只指定缓存时间

proxy_cache_valid 5m;

   然后只有200,301和302响应被缓存。

 

此外,它可以被指定缓存任何响应通过使用any参数:

   proxy_cache_valid 200 302 10m;

 

proxy_cache_valid 301      1h;

 

proxy_cache_valid any      1m;

 

缓存的参数也能通过响应头直接设置。这个设置具有更高优先级比通过缓存指令设置的缓存时间。“X-ACCEL-Expires”头字段以秒为单位设置响应的缓存时间。0禁止缓存响应。

 

如果一个值以前缀@开始,将针对响应设置一个绝对过期时间(自1970年1月1日0时到达过期时间的绝对秒数)的缓存。若是响应头中没有 “X-Accel-Expires” 字段,则缓存参数可以通过“Expires” or “Cache-Control”字段进行设置。若是一个响应头包括“Set-Cookie” 字段,则这样的响应将不被缓存。这样的一个或者多个响应头字段的处理可以通过proxy_ignore_headers 指令进行禁止。

 

 

1.10 proxy_no_cache 

 

syntax:

proxy_no_cache string…;

default:

context:

http, server, location

 

定义条件下的反应将不会被保存到高速缓存。如果至少有一个值的字符串参数不为空,不等于“0”,那么响应将不会被保存:

proxy_no_cache$ cookie_nocache$ arg_nocache$ arg_comment;

proxy_no_cache$ http_pragma HTTP_AUTHORIZATION;

 

可用于沿的proxy_cache_bypass指令。

 

定义一些条件,当响应满足这些条件时将不被缓存起来。在条件字符串中至少有一个条件不为空或者0,符合这样条件的响应才不会被缓存。

 

proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;

 

proxy_no_cache $http_pragma    $http_authorization;

 


二、nginx cache的相关结构体

2.1 ngx_http_file_cache_s结构体

ngx_http_file_cache_sh_t和ngx_http_file_cache_s是用来管理cache内容的结构体,本身并不保存cache的内容。


ngx_path_t 用来描述每个存储文件的目录信息

当在nginx.conf使用xxx_cache_path这个命令时,将初始化上述结构体,具体在函数ngx_http_file_cache_set_slot 中实现对应成员的初始化。

cache->path->manager= ngx_http_file_cache_manager;

cache->path->loader= ngx_http_file_cache_loader;

cache->path->data= cache;

cache->path->conf_file= cf->conf_file->file.name.data;

cache->path->line= cf->conf_file->line;

cache->loader_files= loader_files;

cache->loader_sleep= loader_sleep;

cache->loader_threshold= loader_threshold;

cache->shm_zone->init= ngx_http_file_cache_init;

cache->shm_zone->data= cache;

cache->inactive= inactive;

cache->max_size= max_size;

 

其中ngx_http_file_cache_init实现ngx_http_file_cache_sh_t,也就是共享内存的初始化。

其中所有的path都由ngx_cycle_t->paths集中管理,对应的函数是ngx_add_path,临时目录:响应数据先写入临时文件,然后将其重命名为缓存文件,因此推荐xxx_temp_path和cache目录位于同一文件系统。



2.2 ngx_http_file_cache_node_t结构体

ngx_http_file_cache_node_t结构体用于将缓存文件的内容保存在共享内存中,以便多个worker进程使用。cache_node的管理算法为lru算法,即node查找和存储使用红黑树,超时管理使用队列,具体请参看http://flychao88.iteye.com/blog/1977653。



2.3 ngx_http_file_cache_header_t结构体

ngx_http_file_cache_header_t结构体为包头结构,用于表示文件系统中的缓存文件的存储格式,存储缓存文件的相关信息(修改时间、缓存 key 的 crc32 值、和用于指明HTTP 响应包头和包体在缓存文件中偏移位置的字段等)。


文件缓存格式信息


2.4 ngx_http_cache_t结构体

ngx_http_cache_t结构体用于表示cache的完整信息,它保存在ngx_http_request_s结构体中,即每一个http request当开启cache功能之后,将通过ngx_http_cache_t来保存对应的缓存条目信息。请求使用的缓存 file_cache 、缓存条目对应的缓存节点信息 node 、缓存文件 fi
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值