Nginx缓存配置

Nginx缓存配置

当启用了 Nginx 的缓存功能时,Nginx 会将后端服务的响应保存在本地磁盘上,在后续的请求中只有请求满足缓存的条件就会命中缓存,Nginx 不会再将请求转发到后端的服务上。

Nginx缓存配置指令详解

指令一

语法

proxy_cache

默认值

proxy_cache off;

作用域

http, server, location

说明

设置是否开启对后端响应的缓存,如果开启的话,参数值就是 zone 的名称,比如 proxy_cache mycache。

指令二

语法

proxy_cache_valid

作用域

http, server, location

说明

针对不同的 response code 设定不同的缓存时间,如果不设置 code,默认为 200,301,302 也可以用 any 指定所有 code。

指令三

语法

proxy_cache_key

默认值

proxy_cache_key schemeschemeproxy_host$request_uri;

作用域

http, server, location

说明

给缓存设定 key,默认值相当于 proxy_cache_key schemeproxy_hosturl is_args$args

指令四

语法

proxy_cache_path

默认值

proxy_cache_path /var/cache levels=1:2 keys_zone=imgcache:100m inactive=2h max_size=1g;

作用域

http

说明

指定缓存存储的路径,文件名为 cache key 的 md5 值,然后多级目录的话,根据 level 参数来生成,比如levels=1:2:3,第一个目录名取 md5 值的倒数第一个值,第二个目录名取 md5 值的第 2 和 3 个值,第三个目录名取 md5 值的第 4,5,6 个值。

key_zone 参数用来指定在共享内存中缓存的元数据的名称和内存大小,比如 keys_zone=imgcache:100m,所有的缓存查找首先经过这里查找元数据,如果命中再去文件系统查找相应的缓存。

inactive 用来指定缓存没有被访问超时移除的时间,默认是10 分钟,也可以自己指定比如 inactive=2h;max_size 用来指定缓存的最大值,超过这个值则会自动移除最近最少使用的缓存。

指令四

语法

proxy_cache_bypass

作用域

http, server, location

说明

指定哪些响应在某些值不为空或不为0的情况下不走缓存,比如 proxy_cache_bypass http_pragma http_authorization;

指令四

语法

proxy_cache_min_uses

默认值

proxy_cache_min_uses 1;

作用域

http, server, location

说明

指定在多少次请求之后才缓存响应内容。

指令五

语法

proxy_cache_use_stale

默认值

proxy_cache_use_stale off;

作用域

http, server, location

说明

指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存,比如 proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;

指令六

语法

proxy_cache_lock

默认值

proxy_cache_lock off;

作用域

http, server, location

说明

默认不开启,开启的话则每次只能有一个请求更新相同的缓存,其他请求要么等待缓存有数据要么限时等待锁释放,nginx 1.1.12才开始有。

指令七

语法

proxy_cache_lock_timeout

默认值

proxy_cache_lock_timeout 5s;

作用域

http, server, location

说明

等待缓存锁超时之后将直接请求后端,结果不会被缓存, nginx 1.1.12 才开始有。

Nginx缓存配置说明

启用响应缓存

要开始 Nginx 响应缓存,我们需要在 http 配置块中添加配置指令 proxy_cache_path。该指令的第一个参数必须是一个本机文件系统路径。参数 keys_zone 也是必须的,用来设置共享内存缓存区的名称和大小。 该内存区域是用来保存缓存条目的原信息的。例如:

http { ... proxy_cache_path /path/to/cache levels=1:2 keys_zone=one:10m max_size=10g inactive=60m use_temp_path=off;}

配置好 proxy_cache_path 后,我们还需要配置 proxy_cache 指令,语法如下:

Syntax: proxy_cache zone | off;Default: proxy_cache off;Context: http, server, location

例子:

http { ... proxy_cache_path /data/nginx/cache keys_zone=one:10m; server { proxy_cache one; location / { proxy_pass http://localhost:8000; } }}

proxy_cache 指令有两个参数 zoneoffzone 的取值是 proxy_cache_path 指令中指定的共享内存区域名称的值(上例中的 one), 如果取值为 off 则表示禁用缓存功能(注意限制范围)。

proxy_cache_path 指令的完整语法如下:

Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];Default: -Context: http

Nginx对缓存的处理

Nginx 针对响应缓存有两个处理动作,即:

  1. 缓存管理器会定时检查缓存的状态。如果缓存的内容大小达到了指令 proxy_cache_path 的参数 max-size 指定的值,则缓存管理器会根据 LRU 算法删除缓存的内容。 在检查的间隔时间内,总的缓存内容大小可以临时超过设定的大小阈值。

  2. 缓存加载器只在 Nginx 启动的时候执行一次,将缓存内容的原信息加载到指定的共享内存区内。一次将所有的缓存内容加载到内存中会耗费大量的资源,并且会影响 Nginx 启动后几分钟内的性能。为了避免这种问题可以通过在指令 proxy_cache_path 后添加下面的参数:

    参数 说明
    loader_threshold 缓存加载器加载缓存内容的最大执行时间(单位是毫秒,默认值是200毫秒)。
    loader_files 在缓存加载器加载缓存内容的执行时间间隔内,最多能加载多少个缓存条目,默认100。
    loader_sleeps 每两次执行的时间间隔, 单位是毫秒 (默认50毫秒)

例如:

proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;

指定缓存条件

默认情况下,Nginx 会缓存所有第一次通过 HTTP GET 和 HEAD 方法发起的请求。Nginx 将请求的完整字符串作为缓存内容的 KEY。如果后面的请求和缓存的内容拥有相同的 KEY,则 Nginx 会将缓存的内容发送给客户端。我们也可以在 http, server,location 块内包含各种指令来控制哪些响应可以被缓存。

可以通过使用指令 proxy_cache_key 来控制缓存KEY的生成规则:

proxy_cache_key "$host$request_uri$cookie_user";

可以通过指令 proxy_cache_min_uses 指定一个请求的响应被缓存前的最小访问次数:

proxy_cache_min_uses 5;

可以通过指令 proxy_cache_methods 指定只有哪些HTTP请求类型才能被缓存:

proxy_cache_methods GET HEAD POST;

限制或旁路缓存

默认情况下响应内容会拥有被缓存起来,除非缓存内容的大小超过了指定的配置大小,超过以后会根据 LRU 算法进行删除。单我们也可以通过在 http,server,location 中配置统一的过期时间:

proxy_cache_valid 200 302 10m;proxy_cache_valid 404 1m;

上面的配置指定了当后端服务的响应是 200,302 时,缓存的有效期是 10 分钟;404 缓存有效期为 1 分钟。

proxy_cache_valid any 5m;

也可以不区分后端的响应码,此时可以用 any 来指代。可以通过指令 proxy_cache_bypass 指定 Nginx 使用缓存的条件,如下:

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

该指令的每个参数都指定了一个条件,只有请求满足其中的任何一个条件,并且参数的值不是 0,则 Nginx 会把请求转发到后端的服务而不会使用缓存。

可以通过指令 proxy_no_cache 指定哪些请求不需要 Nginx 来缓存,配置格式和 proxy_cache_bypass 类似:

proxy_no_cache $http_pragma $http_authorization;

清除缓存内容

Nginx 提供了清除过期缓存内容的功能。 这个功能是非常有必要的,一方面我们可以手动删除过期的缓存内容;另一方面我们当我们后端的内容已经改变了,我们就可以通过删除老的缓存来使用新的内容。缓存的删除是通过特殊的 HTTP 请求方法 purge 或自定义的请求头来实现的。

Nginx proxy_cache缓存配置实例

http { # we set this to be on the same filesystem as proxy_cache_path proxy_temp_path /usr/local/nginx/proxy_temp; # good security practice dictates that this directory is owned by the # same user as the user directive (under which the workers run) proxy_cache_path /usr/local/nginx/proxy_temp keys_zone=CACHE:10m levels=1:2 inactive=6h max_size=1g; server { location / { # using include to bring in a file with commonly-used settings include proxy.conf; # referencing the shared memory zone defined above proxy_cache CACHE; proxy_cache_valid any 1d; proxy_cache_bypass $http_pragma $http_authorization; proxy_cache_min_uses 3; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; proxy_pass http://upstream; } }}

Nginx缓存配置总结

当启用了 Nginx 的缓存功能时,Nginx 会将后端服务的响应保存在本地磁盘上,在后续的请求中只有请求满足缓存的条件就会命中缓存,Nginx 不会再将请求转发到后端的服务上。