在开发中,为了提高系统响应速度、减轻服务器压力和提高系统并发性,引入了缓存。缓存对于性能优化而言,是一种能够大幅度提升性能的方案,因此几乎可以在各处都能看见缓存,如客户端缓存、代理缓存、服务器缓存等等。
Nginx 使用 proxy_cache 和 proxy_cache_path 指令实现缓存功能,并且 Nginx 的缓存属于代理缓存的一种,它有如下优势:
(1)减少向后端或文件服务器请求资源的带宽消耗
(2)降低了下游服务器的访问压力,提升系统整体吞吐
(3)缩短了响应时间,提升了加载速度,打开页面的速度更快
该指令用于配置公用的内存区域以存放缓存的索引数据,这个内存区域的名称可以通过 proxy_cache 指令进行设置。当 Nginx 服务器启动时,缓存索引重建进程会负责建立这个内存区域,并在 Nginx 服务器的整个运行过程中,缓存管理进程会定时检测并管理这个内存区域中的过期数据和其他检索工作。
proxy_cache 语法如下:
proxy_cache zone | off;
其中,zone 是设置的用于存放缓存索引的内存区域的名称,而 off 则表示关闭缓存功能。nginx 默认设置为 off。
该指令用于定义缓存文件存储路径和缓存相关参数的指令,定义缓存数据的存储位置以及缓存如何被清理和管理的规则。
proxy_cache_path 语法如下:
http { 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]; }
参数说明:
path:缓存的路径地址。
levels:缓存存储的层次结构,最多允许三层目录。
use_temp_path:是否使用临时目录。
keys_zone:指定一个共享内存空间来存储热点Key(1M可存储8000个Key)。
inactive:设置缓存多长时间未被访问后删除(默认是十分钟)。
max_size:允许缓存的最大存储空间,超出后会基于LRU算法移除缓存,Nginx会创建一个Cache manager的进程移除数据,也可以通过purge方式。
manager_files:manager进程每次移除缓存文件数量的上限。
manager_sleep:manager进程每次移除缓存文件的时间上限。
manager_threshold:manager进程每次移除缓存后的间隔时间。
loader_files:重启Nginx载入缓存时,每次加载的个数,默认100。
loader_sleep:每次载入时,允许的最大时间上限,默认200ms。
loader_threshold:一次载入后,停顿的时间间隔,默认50ms。
purger:是否开启purge方式移除数据。
purger_files:每次移除缓存文件时的数量。
purger_sleep:每次移除时,允许消耗的最大时间。
purger_threshold:每次移除完成后,停顿的间隔时间。
下面配置了 Nginx 代理缓存:
http{ # 设置缓存的目录,并且内存中缓存区名为 hot_cache,大小为128m, # 三天未被访问过的缓存自动清除,磁盘中缓存的最大容量为2GB。 proxy_cache_path /log/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g; server{ location / { # 使用名为 hot_cache 的缓存空间 proxy_cache hot_cache; # 对于200、206、304、301、302状态码的数据缓存1天 proxy_cache_valid 200 206 304 301 302 1d; # 对于其他状态的数据缓存30分钟 proxy_cache_valid any 30m; # 定义生成缓存键的规则(请求的url+参数作为key) proxy_cache_key $host$uri$is_args$args; # 资源至少被重复访问三次后再加入缓存 proxy_cache_min_uses 3; # 出现重复请求时,只让一个去后端读数据,其他的从缓存中读取 proxy_cache_lock on; # 上面的锁超时时间为3s,超过3s未获取数据,其他请求直接去后端 proxy_cache_lock_timeout 3s; # 对于请求参数或cookie中声明了不缓存的数据,不再加入缓存 proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; # 在响应头中添加一个缓存是否命中的状态(便于调试) add_header Cache-status $upstream_cache_status; } } }