Nginx缓存集成07

Nginx缓存集成

缓存概述

客户端的所有请求直接请求服务端, 会影响服务端的性能. 如: 接收过多请求, 压力增大, 某些操作比较耗时, 影响响应速度. 所以引入缓存机制可以大大减轻服务器压力.

用户请求资源数据时, 先从缓存中查看, 若缓存中存在则直接返回给客户, 若不存在, 才请求服务器资源获取, 在返回用户的同时将其放入缓存, 下次就可以直接从缓存中获取

缓存使用场景:

场景 作用
操作系统磁盘缓存 减少磁盘机械操作
数据库缓存 减少文件系统IO操作
应用程序缓存 减少对数据库的查询
Web服务器缓存 减少对应用服务器请求次数
浏览器缓存 减少后台交互次数

缓存优点:

减少数据传输, 节省网络带宽流量, 加快响应速度, 提升用户体验

减轻服务器压力

提供服务端高可用性

缓存缺点:

数据的即时性和一致性可能有延迟

增加成本

Nginx的web缓存服务

基于proxy store实现, 将URL及相关组合当做key, 在使用MD5算法对key进行哈希, 的到硬盘对应的哈希目录路径, 从而将缓存内容保存在该目录中. Nginx支持对指定URL或者状态码设置过期时间, 也可以使用purge命令手动清除指定URL缓存

image-20220605014002839

Nginx缓存设置指令

Nginx的web缓存服务主要是使用ngx_http_proxy_module完成,常用指令如下:

1
文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
proxy_cache_path指令

用于设置缓存文件的存储路径

1
2
3
4
语法:
proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size]
位置:
http块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- path 为缓存路径地址, 如: /usr/local/proxy_cache

- levels 指定缓存空间子目录等级, 最多设置三层, 每层取值为1或2. 如:
levels=1:2 代表缓存空间有两层, 第一层是一个字符, 第二层是两个字符
设置key=ni9ne, 通过MD5编码后为:f5d6316dd7ab283c02f90cd236dce1cc
levels=1:2 最终存储路径为: /usr/local/proxy_path/c/1c
levels=2:1:2最终存储路径为: /usr/local/proxy_path/cc/1/ce

- key_zone 指定该缓存区名称和大小. 如:
key_zone=ni9ne:200m 代表缓存区的名称为ni9ne,大小为200m

- inactive 指定缓存数据多久时间未访问才会删除.如:
inactive=1d 代表数据仅缓存1天, 1天内没有访问就会删除

- max_size 设置最大缓存空间, 若空间已满, 默认覆盖缓存时间最长的资源
max-size=20g

配置实例:

1
2
3
4
5
http{
...
proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=1d max_size=20g
...
}
proxy_cache指令

用于开启或关闭指定缓存配置

1
2
3
4
5
6
语法:
proxy_cache zone_name [off];
默认值:
proxy_cache off;
位置:
http server location块
1
- zone_name 指定用于缓存区的名称
proxy_cache_key指令

用于指定web缓存的key值, Nginx会依据key值MD5哈希存储缓存

1
2
3
4
5
6
语法:
proxy_cache_key key;
默认值:
proxy_cache_key $scheme$proxy_host$request_uri;
位置:
http server location块
proxy_cache_valid指令

用于对不同返回状态码的URL设置不同的缓存时间

1
2
3
4
语法:
proxy_cache_valid [code] time;
位置:
http server location块
1
2
3
4
5
6
如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 设置200和302响应的URL缓存10分钟, 响应404的URL缓存1分钟
proxy_cache_valid any 1m;
# 对所有响应状态码的URL都设置1分钟缓存
proxy_cache_min_uses指令

用于设置资源被访问多少次后备缓存

1
2
3
4
5
6
语法:
proxy_cache_min_uses;
默认值:
proxy_cache_min_uses 1;
位置:
http server location块
proxy_cache_methods指令

用于设置缓存哪些方法的请求

1
2
3
4
5
6
语法:
proxy_cache_methods GET|HEAD|POST;
默认值:
proxy_cache_methods GET HEAD;
位置:
http server location块

Nginx缓存设置案例

客户端请求134服务器, 获取jquery.js文件, 但文件存在于135服务器中, 服务器134在获取135资源后, 将其缓存, 后续请求资源将从缓存中获取

环境准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 135服务器配置jquery.js路径
server{
listen 80;
server_name localhost;
location /js{
root /var/www/project/;
index index.html;
}
}
# 配置完成后测试是否可以访问路径: http://192.168.253.135/js/jquery.js

# 134配置代理转发
server {
listen 80;
server_name localhost;
location /js {
proxy_pass http://192.168.253.135/js/;
}
}
# 配置完成后测试是否可以获取文件 http://192.168.253.134/js/jquery.js
添加缓存配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 修改134服务器配置为:
http{
...
proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=30s max_size=20g
...
server {
listen 80;
server_name localhost;
location /js {
proxy_cache ni9ne;
proxy_cache_key $scheme$proxy_host$request_uri;
proxy_cache_valid 200 20s;
proxy_cache_valid 404 30s; # 访问404状态保存30秒
proxy_cache_valid any 1m;
proxy_cache_min_uses 5; # 最少使用5次后才缓存
# 添加header,验证缓存命中状态 HIT/MISS
add_header Nginx-Cache-Status "$upstream_cache_status";
proxy_pass http://192.168.253.135/js/;
}
}
}
验证缓存结果

image-20220605202848657

image-20220605203305150

Nginx缓存清除

方式一: 删除对应缓存目录
1
$ sudo rm -rf /usr/local/proxy_pass/...
方式二: 第三方扩展模块

使用ngx_cache_purge模块清除缓存, 需要安装模块

1
模块: https://github.com/FRiCKLE/ngx_cache_purge
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 配置清除路由
http {
proxy_cache_path /usr/local/proxy_cache levels=2:2 keys_zone=ni9ne:200m inactive=30s max_size=2g;
server {
location /js {
proxy_cache ni9ne;
proxy_cache_key $scheme$host$request_uri;
proxy_cache_valid any 1m;
add_header Nginx-Cache-Status "$upstream_cache_status";
add_header Nginx-Cache-Key "$scheme$host$request_uri";
proxy_pass http://192.168.253.135/js/;
}
location ~ /purge(/.*) {
proxy_cache_purge ni9ne $scheme$host$1; # 无法获取$proxy_host
}
}
}

访问清除页面结果

image-20220606010637248

Nginx设置资源不缓存

对不需要缓存的数据进行指定, 使用以下指令可以实现

proxy_no_cache指令

定义不缓存数据的条件

1
2
3
4
语法:
proxy_no_cache string ...;
位置:
http server location块
1
2
# 配置实例
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass指令

设置不从缓存中获取数据的条件

1
2
3
4
语法: 
proxy_cache_bypass string ...;
位置:
http server location块
1
2
# 配置实例
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

上述两个指令均支持多个条件, 且可以同时使用, 条件中只要至少有一个不为空且不等于’0’, 则条件满足成立, 不缓存或不获取缓存数据

涉及内置变量介绍
1
2
3
4
5
- $cookie_nocache
当前请求的cookie中键为nocache对应的值
测试可使用 add_header Set-Cookie 'nocache=1'
- $arg_nocache/$arg_comment
当前请求的参数中属性名为nocache和comment对应的属性值
案例实现
1
2
3
4
5
6
7
8
9
10
11
12
13
http {
server {
location /js {
if ($request_uri ~ /.*\.js$){
set $my_cache_sign 1;
}
proxy_cache ni9ne;
proxy_pass http://192.168.253.135/js/;
# proxy_no_cache $cookie_nocache $arg_nocache $arg_comment $my_cache_sign;
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment $my_cache_sign;
}
}
}

image-20220606014448985