Nginx缓存服务
7.1 缓存配置语法
proxy_cache 配置语法
S
yntax: 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 stryuan;
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$argsproxy_cache_key 是 Nginx 中⽤于设置缓存 Key 的指令,可以⽤来控制哪些请求会被缓存以及如何组成缓存
Key。⽽ $host$uri$is_args$args 是⼀种 Nginx 内置的变量,它们分别表示请求的 Host、 URI、是否带有 ?
以及请求参数。因此, proxy_cache_key
uri
args 这条指令表示使⽤ $host 、 $uri 、 $is_args 和
$args 四个变量作为⽣成缓存 Key 的基础,并按照这个顺序组合成⼀个字符串,作为具体的缓存 Key。这样,同
⼀请求的不同参数就会⽣成不同的缓存 Key,从⽽保证缓存的准确性和有效性。注意的是, proxy_cache_key 的设置应该根据具体业务场景进⾏调整,以达到最佳的缓存效果。在⼀些没
有参数的静态资源请求中,可以只使⽤ $host$uri 作为缓存 Key,⽽在有参数或者情况较为复杂的请求
中,需要使⽤更多的变量来⽣成缓存 Key。
7.2 缓存配置实践 √
1.缓存准备
系统 服务 地址
CentOS7.4 Nginx Proxy Cache 代理cache服务器 10.1.106.70
CentOS7.4 Nginx Web 后端 192.168.1.152
2.web节点准备
192.168.1.152
//建⽴相关⽬录
[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
2.代理配置缓存
10.1.106.70
[root@proxy ~]# mkdir /soft/cache
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_cache.conf
upstream cache {
server 192.168.1.152:8081;
server 192.168.1.152:8082;
server 192.168.1.152: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.yuansredevsecops.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;
}
}
3.客户端测试
7.4 缓存清理实践 √
Nginx缓存及使⽤ngx_cache_purge进⾏缓存清除 :https://www.jianshu.com/p/1a89ab25ea78如何清理 proxy_cache 代理缓存rm删除已缓存数据
[root@proxy ~]# rm -rf /soft/cache/*
[root@proxy ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html |grep "Nginx-Cache"
Nginx-Cache: MISS通过 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.0.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=/soft/src/ngx_cache_purge-2.3
[root@nginx src]# make && make install//需要将上⽂的缓存proxy_cache.conf⽂件拷⻉⾄源码包中
[root@linuxprobe conf]# pwd
/etc/softwares/nginx/conf
[root@linuxprobe conf]# cp /etc/nginx/conf.d/proxy_cache.conf ./
//并增加如下内容
[root@linuxprobe conf]# vim proxy_cache.conf
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.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使⽤浏览器访问建⽴缓存1685168215822通过 purge 请求对应的缓存数据,自动清理缓存1685168250223再次刷新就会 404 因为缓存内容已清理1685168264496#若访问失败则检查nginx.conf配置文件并授权
[root@linuxprobe logs]# cat /etc/softwares/nginx/conf/nginx.conf
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;include ./conf.d/*.conf;
}
[root@linuxprobe logs]# chmod 777 -R /soft/cache/
#检查配置文件存放位置,必须在conf.d文件夹下
[root@linuxprobe conf.d]# ls
proxy_cache.conf
[root@linuxprobe conf.d]# pwd
/etc/softwares/nginx/conf/conf.d
[root@linuxprobe logs]# mkdir -p conf.d
7.5 部分页面不缓存 √
指定部分⻚⾯不进⾏ proxy_Cache 缓存
cat proxy_cache.conf
upstream cache{
server 192.168.1.152:8081;
server
192.168.1.152:8082;
server 192.168.1.152: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.yuansredevsecops.top;
#选择清理url3缓存
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.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@nginx ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
7.6 缓存日志记录统计 √
通过⽇志记录 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访问, 最后检查⽇志命令情况
[root@linuxprobe ~]# curl -s -I http://cache.yuansredevsecops.top/url3.html|grep "Nginx-Cache"
Nginx-Cache: MISS
[root@linuxprobe ~]# curl -s -I http://cache.yuansredevsecops.top/url1.html|grep "Nginx-Cache"
Nginx-Cache: HIT
[root@linuxprobe ~]# tailf /var/log/nginx/proxy_cache.log
curl/7.29.0/url3.html192.168.1.170 - - [31/May/2023:16:39:20 +0800] "HEAD /url3.html HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""MISS"
curl/7.29.0/url1.html192.168.1.170 - - [31/May/2023:16:39:25 +0800] "HEAD /url1.html HTTP/1.1" 200 0 "-" "curl/7.29.0" "-""HIT"