Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nginx配置Proxy Cache #28

Open
hunter-ji opened this issue Jan 7, 2021 · 0 comments
Open

Nginx配置Proxy Cache #28

hunter-ji opened this issue Jan 7, 2021 · 0 comments
Labels
运维 运维

Comments

@hunter-ji
Copy link
Owner

一. 前言

当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参数。

五. 参考文档

@hunter-ji hunter-ji added the 运维 运维 label Jan 7, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
运维 运维
Projects
None yet
Development

No branches or pull requests

1 participant