电子商务网站中最基本的系统是,广西住房和城乡建设厅网站证件,企业建设网站的价值,廊坊网站建设设计对于性能优化而言#xff0c;缓存是一种能够大幅度提升性能的方案#xff0c;因此几乎可以在各处都能看见缓存#xff0c;如客户端缓存、代理缓存、服务器缓存等等#xff0c;Nginx的缓存则属于代理缓存的一种。对于整个系统而言#xff0c;加入缓存带来的优势额外明显缓存是一种能够大幅度提升性能的方案因此几乎可以在各处都能看见缓存如客户端缓存、代理缓存、服务器缓存等等Nginx的缓存则属于代理缓存的一种。对于整个系统而言加入缓存带来的优势额外明显
减少了再次向后端或文件服务器请求资源的带宽消耗。降低了下游服务器的访问压力提升系统整体吞吐。缩短了响应时间提升了加载速度打开页面的速度更快。
那么在Nginx中又该如何配置代理缓存呢先来看看缓存相关的配置项「proxy_cache_path」代理缓存的路径。语法
proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_sleeptime] [manager_thresholdtime] [loader_filesnumber] [loader_sleeptime] [loader_thresholdtime] [purgeron|off] [purger_filesnumber] [purger_sleeptime] [purger_thresholdtime];是的你没有看错就是这么长....解释一下每个参数项的含义
path缓存的路径地址。levels缓存存储的层次结构最多允许三层目录。use_temp_path是否使用临时目录。keys_zone指定一个共享内存空间来存储热点Key(1M可存储8000个Key)。inactive设置缓存多长时间未被访问后删除默认是十分钟。max_size允许缓存的最大存储空间超出后会基于LRU算法移除缓存Nginx会创建一个Cache manager的进程移除数据也可以通过purge方式。manager_filesmanager进程每次移除缓存文件数量的上限。manager_sleepmanager进程每次移除缓存文件的时间上限。manager_thresholdmanager进程每次移除缓存后的间隔时间。loader_files重启Nginx载入缓存时每次加载的个数默认100。loader_sleep每次载入时允许的最大时间上限默认200ms。loader_threshold一次载入后停顿的时间间隔默认50ms。purger是否开启purge方式移除数据。purger_files每次移除缓存文件时的数量。purger_sleep每次移除时允许消耗的最大时间。purger_threshold每次移除完成后停顿的间隔时间。
「proxy_cache」开启或关闭代理缓存开启时需要指定一个共享内存区域。语法
proxy_cache zone | off;zone为内存区域的名称即上面中keys_zone设置的名称。「proxy_cache_key」定义如何生成缓存的键。语法
proxy_cache_key string;string为生成Key的规则如$scheme$proxy_host$request_uri。「proxy_cache_valid」缓存生效的状态码与过期时间。语法
proxy_cache_valid [code ...] time;code为状态码time为有效时间可以根据状态码设置不同的缓存时间。例如proxy_cache_valid 200 302 30m;「proxy_cache_min_uses」设置资源被请求多少次后被缓存。语法
proxy_cache_min_uses number;number为次数默认为1。「proxy_cache_use_stale」当后端出现异常时是否允许Nginx返回缓存作为响应。语法
proxy_cache_use_stale error;error为错误类型可配置timeout|invalid_header|updating|http_500...。「proxy_cache_lock」对于相同的请求是否开启锁机制只允许一个请求发往后端。语法
proxy_cache_lock on | off;「proxy_cache_lock_timeout」配置锁超时机制超出规定时间后会释放请求。
proxy_cache_lock_timeout time;「proxy_cache_methods」设置对于那些HTTP方法开启缓存。语法
proxy_cache_methods method;method为请求方法类型如GET、HEAD等。「proxy_no_cache」定义不存储缓存的条件符合时不会保存。语法
proxy_no_cache string...;string为条件例如$cookie_nocache $arg_nocache $arg_comment;「proxy_cache_bypass」定义不读取缓存的条件符合时不会从缓存中读取。语法
proxy_cache_bypass string...;和上面proxy_no_cache的配置方法类似。「add_header」往响应头中添加字段信息。语法
add_header fieldName fieldValue;「$upstream_cache_status」记录了缓存是否命中的信息存在多种情况
MISS请求未命中缓存。HIT请求命中缓存。EXPIRED请求命中缓存但缓存已过期。STALE请求命中了陈旧缓存。REVALIDDATEDNginx验证陈旧缓存依然有效。UPDATING命中的缓存内容陈旧但正在更新缓存。BYPASS响应结果是从原始服务器获取的。
❝PS这个和之前的不同之前的都是参数项这个是一个Nginx内置变量。❞OK~对于Nginx中的缓存配置项大概了解后接着来配置一下Nginx代理缓存
http{ # 设置缓存的目录并且内存中缓存区名为hot_cache大小为128m # 三天未被访问过的缓存自动清楚磁盘中缓存的最大容量为2GB。 proxy_cache_path /soft/nginx/cache levels1:2 keys_zonehot_cache:128m inactive3d max_size2g; server{ location / { # 使用名为nginx_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; } }
} 接着来看一下效果如下 第一次访问时因为还没有请求过资源所以缓存中没有数据因此没有命中缓存。第二、三次依旧没有命中缓存直至第四次时才显示命中这是为什么呢因为在前面的缓存配置中我们配置了加入缓存的最低条件为「「资源至少要被请求三次以上才会加入缓存。」」 这样可以避免很多无效缓存占用空间。
缓存清理
当缓存过多时如果不及时清理会导致磁盘空间被“吃光”因此我们需要一套完善的缓存清理机制去删除缓存在之前的proxy_cache_path参数中有purger相关的选项开启后可以帮我们自动清理缓存但遗憾的是**purger系列参数只有商业版的NginxPlus才能使用因此需要付费才可使用。**不过天无绝人之路我们可以通过强大的第三方模块ngx_cache_purge来替代先来安装一下该插件①首先去到Nginx的安装目录下创建一个cache_purge目录
[rootlocalhost]# mkdir cache_purge cd cache_purge ②通过wget指令从github上拉取安装包的压缩文件并解压
[rootlocalhost]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
[rootlocalhost]# tar -xvzf 2.3.tar.gz ③再次去到之前Nginx的解压目录下
[rootlocalhost]# cd /soft/nginx/nginx1.21.6 ④重新构建一次Nginx通过--add-module的指令添加刚刚的第三方模块
[rootlocalhost]# ./configure --prefix/soft/nginx/ --add-module/soft/nginx/cache_purge/ngx_cache_purge-2.3/ ⑤重新根据刚刚构建的Nginx再次编译一下「但切记不要make install」
[rootlocalhost]# make ⑥删除之前Nginx的启动文件不放心的也可以移动到其他位置
[rootlocalhost]# rm -rf /soft/nginx/sbin/nginx ⑦从生成的objs目录中重新复制一个Nginx的启动文件到原来的位置
[rootlocalhost]# cp objs/nginx /soft/nginx/sbin/nginx 至此第三方缓存清除模块ngx_cache_purge就安装完成了接下来稍微修改一下nginx.conf配置再添加一条location规则
location ~ /purge(/.*) { # 配置可以执行清除操作的IP线上可以配置成内网机器 # allow 127.0.0.1; # 代表本机 allow all; # 代表允许任意IP清除缓存 proxy_cache_purge $host$1$is_args$args;
} 然后再重启Nginx接下来即可通过http://xxx/purge/xx的方式清除缓存。