这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
一. 前言
当Ngnix的缓存被打开之后,Nginx会将符合规则的response存储到文件作为缓存,并且用其缓存去响应客户端,不需要每次都去服务端请求。
二. 开启缓存
1. 如何开启
要开启缓存,需要在最顶级的http {}下配置proxy_cache_path。
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
此处可以选择直接修改/etc/nginx/nginx.conf文件,如上代码所示添加。也可以直接在/etc/nginx/conf.d文件夹下创建新的conf文件,如settings.conf,内容如下:
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
2. 参数详解
- /path/to/cache : 本地路径,缓存文件存放地址;
- levels : 默认所有缓存文件都放在同一个/path/to/cache下,从而影响缓存的性能,大部分场景推荐使用2级目录来存储缓存文件;
- key_zone : 在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key;
- max_size : 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件;
- inactive : 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件,默认为10分钟。“需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件”;
- use_temp_path : 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝;
- proxy_cache : 启用proxy cache,指定key_zone;
3. nginx初始化读取缓存配置
Nginx在缓存中使用到两个进程:
cache manager:该进程周期性地检测缓存的状况,检测缓存的大小、数量等是否超过设置额度;cache loeader:该进程只会在Nginx启动后运行一次,加载之前的缓存文件的元数据到共享内存中。在启动时候一次加载整个缓存会消耗Nginx启动时的性能,为了避免这种情况,可以在proxy_cache_path中直接配置如下参数:- loader_threshold:一个迭代的持续时间,单位为ms,默认值200;
- loader_files:一个迭代中加载的最大项目数,默认为100;
- loader_sleeps:迭代之间的推迟,单位为ms,默认值50;
在如下案例中,迭代持续300ms或者直到200个项目已经被加载:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
三. 哪些请求会缓存
默认情况下,Nginx会在第一次缓存所有的GET和HEAD方法的请求的响应,使用字符串作为缓存的key,如果不同的请求使用同一个key,则会直接返回其对应的缓存数据。
1. 修改缓存的key
默认的缓存key为:
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
可以通过配置自定义,如下:
proxy_cache_key "$host$request_uri$cookie_user";
2. 定义在缓存响应之前必须发出具有相同密钥的请求的最小次数
proxy_cache_min_uses 5;
3. 定义缓存方法的请求
默认缓存请求方法为GET和HEAD,通过如下添加POST方法。
proxy_cache_methods GET HEAD POST;
四. 限制或者禁止缓存
默认情况下,响应会无限期的保存下来。只有当缓存大小超过限制或者超出缓存时间的情况下,缓存将会被清除。
1. 根据响应码设定存储时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
如果是匹配所有可以使用any:
proxy_cache_valid any 5m;
2. 忽略缓存
通过设置proxy_cache_bypass配置可以使Nginx不直接使用缓存返回客户端。配置中的每个参数都只是0和非0,只要一个参数不为0,都将不会使用缓存。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
3. 没有缓存
通过设置proxy_no_cache来使得响应完全不缓存,其参数和proxy_cache_bypass一样。
proxy_no_cache $http_pragma $http_authorization;
对于proxy_cache_bypass和proxy_no_cache的参数,如$arg_nocache的意思为请求的url上携带nocache参数。