Nginx配置Proxy Cache

3,502 阅读4分钟

这是我参与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会在第一次缓存所有的GETHEAD方法的请求的响应,使用字符串作为缓存的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. 定义缓存方法的请求

默认缓存请求方法为GETHEAD,通过如下添加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参数。

五. 参考文档

六. 博客原文