Nginx缓存服务
通常情况下缓存是⽤来减少后端压⼒, 将压⼒尽可能的往前推, 减少后端压⼒,提⾼⽹站并发延时缓存常⻅类型
缓存常⻅类型
服务端缓存
代理缓存, 获取服务端内容进⾏缓存
客户端浏览器缓存
Nginx 代理缓存原理
缓存配置语法
proxy_cache 配置语法
Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location
//缓存路径
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
# 缓存过期周期
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
//示例
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
code :返回的 HTTP 状态码,如200(成功),404(未找到)等,也可以⽤ any 表示任何状态码。
time :缓存的有效时间,可以使⽤以下格式:
秒数。例如: proxy_cache_valid 200 60s; 表示 对状态码为200的请求进⾏缓存,有效时间为60
秒。
分钟数。例如: proxy_cache_valid 200 5m; 表示 对状态码为200的请求进⾏缓存,有效时间为5分
钟。
⼩时数。例如: proxy_cache_valid 200 2h; 表示 对状态码为200的请求进⾏缓存,有效时间为2⼩
时。
天数。例如: proxy_cache_valid 200 1d; 表示 对状态码为200的请求进⾏缓存,有效时间为1天。
多个时间。例如: proxy_cache_valid 200 3h 5m; 表示 对状态码为200的请求进⾏缓存,有效时间
为3⼩时5分钟。
可以在 server、location 等上下⽂中使⽤该指令。在 location 上下⽂中使⽤时,可以设置三种不同状态码的缓存
时间:
1xx,2xx,3xx: syntax:proxy_cache_valid [code] time1 [time2];
4xx,5xx: syntax:proxy_cache_valid [code] time;
any :表示任意状态码。
# 缓存的维度
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
//示例
proxy_cache_key "$host$request_uri $cookie_user";
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_key $host$uri$is_args$args
proxy_cache_key 是 Nginx 中⽤于设置缓存 Key 的指令,可以⽤来控制哪些请求会被缓存以及如何组成缓存
Key。⽽ $host$uri$is_args$args 是⼀种 Nginx 内置的变量,它们分别表示请求的 Host、URI、是否带有 ?
以及请求参数。
因此, proxy_cache_key $host$uri$is_args$args 这条指令表示使⽤ $host 、 $uri 、 $is_args 和
$args 四个变量作为⽣成缓存 Key 的基础,并按照这个顺序组合成⼀个字符串,作为具体的缓存 Key。这样,同
⼀请求的不同参数就会⽣成不同的缓存 Key,从⽽保证缓存的准确性和有效性。
注意的是, proxy_cache_key 的设置应该根据具体业务场景进⾏调整,以达到最佳的缓存效果。在⼀些没
有参数的静态资源请求中,可以只使⽤ $host$uri 作为缓存 Key,⽽在有参数或者情况较为复杂的请求
中,需要使⽤更多的变量来⽣成缓存 Key。
缓存配置实践
1.缓存准备
CentOS7.4 Nginx Proxy Cache 代理cache服务器 10.1.106.70
CentOS7.4 Nginx Web 后端 10.1.106.66
2.web节点准备
10.1.106.66
//建⽴相关⽬录
[root@nginx ~]# mkdir -p /soft/code{1..3}
//建⽴相关html⽂件
[root@nginx ~]# for i in {1..3};do echo Code1-Url$i > /soft/code1/url$i.html;done
[root@nginx ~]# for i in {1..3};do echo Code2-Url$i > /soft/code2/url$i.html;done
[root@nginx ~]# for i in {1..3};do echo Code3-Url$i > /soft/code3/url$i.html;done
//配置Nginx
[root@nginx ~]# cat /etc/nginx/conf.d/server.conf
server {
listen 8081;
root /soft/code1;
index index.html;
}
server {
listen 8082;
root /soft/code2;
index index.html;
}
server {
listen 8083;
root /soft/code3;
index index.html;
}
//检查监听端⼝
[root@nginx ~]# netstat -lntp|grep 80
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN
50922/nginx: master
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN
50922/nginx: master
tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN
50922/nginx: master
3.代理配置缓存
10.1.106.70
[root@proxy ~]# mkdir /soft/cache
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_cache.conf
upstream cache {
server 10.1.106.66:8081;
server 10.1.106.66:8082;
server 10.1.106.66:8083;
}
#proxy_cache存放缓存临时⽂件
#levels 按照两层⽬录分级
#keys_zone 开辟空间名, 10m:开辟空间⼤⼩, 1m可存放8000key
#max_size 控制最⼤⼤⼩, 超过后Nginx会启⽤淘汰规则
#inactive 60分钟没有被访问缓存会被清理
#use_temp_path 临时⽂件, 会影响性能, 建议关闭
proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.wingsredevsecops.top;
#proxy_cache 开启缓存
#proxy_cache_valid 状态码200|304的过期为12h, 其余状态码10分钟过期
#proxy_cache_key 缓存key
#add_header 增加头信息, 观察客户端respoce是否命中
#proxy_next_upstream 出现502-504或错误, 会跳过此台服务器访问下台
location / {
proxy_pass http://cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502
http_503 http_504;
include proxy_params;
}
}
4.客户端测试
//
[root@nginx ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html|grep "NginxCache"
Nginx-Cache: MISS
//命中
[root@nginx ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html|grep "NginxCache"
Nginx-Cache: HIT
缓存清理实践
如何清理 proxy_cache 代理缓存
1. rm 删除已缓存数据
[root@proxy ~]# rm -rf /soft/cache/*
[root@proxy ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html |grep "NginxCache"
Nginx-Cache: MISS
2.通过 ngx_cache_purge 扩展模块清理, 需要编译安装 Nginx
//建⽴对应⽬录
[root@proxy ~]# mkdir /soft/src
[root@proxy ~]# cd /soft/src
//下载Nginx包
[root@proxy ~]# wget http://nginx.org/download/nginx-1.21.0.tar.gz
[root@proxy ~]# tar xf nginx-1.21.1.tar.gz
//下载ngx_cache_purge
[root@proxy ~]# wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz
[root@proxy ~]# tar -zxvf 2.3.tar.gz
//编译Nginx
[root@nginx src]# cd nginx-1.21.0/ && ./configure --prefix=/etc/softwares/nginx \
--with-http_stub_status_module \
--with-http_ssl_module --with-stream \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-pcre \
--add-module=../ngx_cache_purge-2.3
[root@nginx src]# make && make install
//需要将上⽂的缓存proxy_cache.conf⽂件拷⻉⾄源码包中, 并增加如下内容
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 192.168.178.0/24;
deny all;
proxy_cache_purge code_cache $host$1$is_args$args;
}
//检测配置重新加载
[root@nginx conf.d]# /etc/softwares/nginx/sbin/nginx -t
[root@nginx conf.d]# /etc/softwares/nginx/sbin/nginx -s reload
使⽤浏览器访问建⽴缓存
通过 purge 请求对应的缓存数据
再次刷新就会 404 因为缓存内容已清理
部分⻚⾯不缓存
指定部分⻚⾯不进⾏ proxy_Cache 缓存
cat proxy_cache.conf
upstream cache{
server 10.1.106.66:8081;
server 10.1.106.66:8082;
server 10.1.106.66:8083;
}
proxy_cache_path /soft/cache levels=1:2 keys_zone=code_cache:10m max_size=10g
inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.wingsredevsecops.top;
if ($request_uri ~ ^/(url3|login|register|password)) {
set $cookie_nocache 1;
}
location / {
proxy_pass http://cache;
proxy_cache code_cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
proxy_cache_key $host$uri$is_args$args;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pargma $http_authorization;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502
http_503 http_504;
include proxy_params;
}
}
//清理缓存
[root@nginx ~]# rm -rf /soft/cache/*
//请求测试
[root@nginx ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html|grep "NginxCache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html|grep "NginxCache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.wingsredevsecops.top/url3.html|grep "NginxCache"
Nginx-Cache: MISS
缓存⽇志记录统计
通过⽇志记录 proxy_cache 命中情况与对应 url
//修改/etc/nginx/nginx.conf中log_format格式
log_format main '$http_user_agent' '$request_uri' '$remote_addr - $remote_user
[$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"$upstream_cache_status"';
//修改proxy_cache.conf, 在server标签新增access⽇志
access_log /var/log/nginx/proxy_cache.log main;
//使⽤curl访问, 最后检查⽇志命令情况
curl/7.29.0/url3.html192.168.56.183 - - [19/Apr/2018:11:48:43 -0400] "HEAD /url3.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""MISS"
curl/7.29.0/url2.html192.168.56.183 - - [19/Apr/2018:11:48:45 -0400] "HEAD /url2.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT"
curl/7.29.0/url2.html192.168.56.183 - - [19/Apr/2018:11:48:46 -0400] "HEAD /url2.html
HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT"
实验完成以后将nginx 停⽌
/etc/softwares/nginx/sbin/nginx -s stop

浙公网安备 33010602011771号