缓存类型
- 浏览器缓存
- Nginx代理服务器缓存
- 服务器缓存,例如Redis、Memcache等
缓存代理服务器
在代理服务器的磁盘中保存请求目标的内容,加快响应速度,减少应用服务器(后端服务器)上的资源开销,比如多客户端请求相同的资源,代理缓存命中后,对于应用服务器来说,只发生了一次资源调度。而浏览器上的缓存配置,一般来说是用来减少本地IO的,请求目标的内容会存放在浏览器本地。
缓存分为两类:时间缓存和空间缓存
时间缓存(比空间缓存用的多):比如上面图片蓝色用户访问了index.html,这个请求通过因特网到达了Nginx之后,因为Nginx没有缓存所以访问了后端应用服务器,应用服务器返回的响应到达了Nginx之后Nginx同时做两件事情。一件事情是将响应返回给用户,第二件事情是将响应缓存到磁盘上。当下一次橘黄色的另外一个用户访问index.html当请求到达Nginx之后,Nginx发现用户缓存的页面已经缓存了而且在有效期之内,,那么就之间返回内容,这样就减少了整个环节。
指令
前面我的博客介绍的是Nginx控制浏览器如何使用缓存,这里是nginx之上怎么配置上游服务器返回响应的缓存
缓存最重要的两个指令是定义存放缓存载体,proxy_cache_path定义了缓存存放在磁盘的位置,key_zone的name就是共享内存的名字,size就是共享内存的大小。共享内存的name就是给proxy_cache用的
Syntax: proxy_cache zone | off;
Default: proxy_cache off;
Context: http, server, location
Syntax:
#只能放在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];
Default: —
Context: http
#缓存关键字,可以任意的修改该key的值
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
#缓存什么样的响应
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
#哪些内容不写入缓存,参数为真时候不写入缓存
Syntax: proxy_no_cache string ...;
Default: —
Context: http, server, location
缓存流程:发起请求
上面图片是在nginx接收到用户请求请求时处理缓存的流程以及从上游收到响应以后决定这个响应是否写入缓存。
proxy_cache_methods
#该指令可以设定对那些用户的请求方法才使用缓存,否则不使用缓存,默认是GET HEAD方法才使用缓存当中的内容
Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location
缓存代理服务器192.168.179.99配置
缓存代理服务器192.168.179.99 http配置
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
proxy_cache_path /data/nginx/cache max_size=10G levels=1:2 keys_zone=nginx_cache:10m
inactive=60m use_temp_path=off;
include /usr/local/nginx/conf/vhost/*.conf;
}
#缓存存放的位置是 /data/nginx/cache,目录层级为两层,最多存放10G缓存
#缓存key存放的内存空间是 nginx_cache ,单个缓存最大为 10m
#自动移除60分钟内没有人访问的缓存
#在将缓存放置到 proxy_cache_path 之前,不使用 use_temp_path
--/data/nginx/cache 缓存资源存放路径
-- max_size 最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除不活跃的cache文件(超出后cache manager进程按照LRU链表淘汰)
-- levels 设置缓存目录的层级,最多三级。默认为levels=1:2,表示Nginx为将要缓存的资源生成的key从后依次设置两级保存,两级目录的意思,每层目录长度为1或者2个字节。
--key_zone 在共享内存中设置一块存储区域来存放缓存的key和metadata,这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
--inactive 未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
-- use_temp_path 如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
[root@www ~]# mkdir -p /data/nginx/cache --创建缓存目录
代理缓存服务器192.168.179.99 location 配置
server {
listen 80;
server_name www.test.com;
charset utf-8;
location /{
proxy_pass http://192.168.179.100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# using include to bring in a file with commonly-used settings
#include proxy.conf; 你可以把上面这些放到proxy.conf当中
#使用nginx_cache 缓存
proxy_cache nginx_cache;
#只要统一个url,不管间隔多久,总次数访问到达3次,就开始缓存。
proxy_cache_min_uses 3;
#指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
#200、304的响应缓存时间为12h
proxy_cache_valid 200 304 302 12h;
#非200、304,302的响应缓存时间为10m
proxy_cache_valid any 10m;
#使用$uri作为缓存key
proxy_cache_key $uri;
#对于以下特定情况,继续请求负载均衡组里面的其他服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
#如果请求中含有参数或者为授权请求,则不缓存
proxy_no_cache $http_pragma $http_authorization;
#向客户端返回一个是否击中缓存的头信息
add_header Nginx-Cache "$upstream_cache_status";
}
}
proxy_cache nginx_cache:表示使用nginx_cache缓存,这个使用之前必须先用proxy_cache_path定义。
proxy_cache_key string:缓存中用于“键”的内容;proxy_cache_key$host$uri$is_args$args;这里设置$host$uri$is_args$args作为键
proxy_cache_min_uses:指同一个url,不管时间间隔多长,是否在一个缓存周期外,只要总次数到达proxy_cache_min_uses次数,就会触发缓存功能。后续缓存失效以后,只要访问一次,又会缓存。
proxy_cache_use_stale:指定在后端服务器在返回什么状态码的情况下可以使用过期的缓存,比如:error timeout invalid_header updating http_500 http_502
后端服务器 192.168.179.100 server配置
很简单就是客户端通过访问代理服务器拿到的是后端服务器上的index.html资源
server{
listen 80;
server_name localhost;
charset utf-8;
error_page 404 =200 /404.html;
location /{
root html;
}
}
[root@www ~]# echo "this is houduan fuwuqi 192.68.179.100 index.html resouce" > /usr/local/nginx/html/index.html --在后端服务器上修改index.html里面的信息
客户端访问缓存服务器
[root@localhost network-scripts]# curl 192.168.179.99 -- --客户端去访问代理服务器,拿到的是后端服务器上的资源
this is houduan fuwuqi 192.68.179.100 index.html resouce
[root@www 83]# cd /data/nginx/cache/ --这个时候可以看到代理服务器上缓存了后端服务器上的资源
[root@www cache]# ls
[root@www cache]# ls
e
[root@www cache]# cd e
[root@www e]# ls
72
[root@www e]# cd 72/
[root@www 72]# ls
1959bec6fcc5a5f1d12590dfe299f72e
可以看到生成的缓存,72红色构成了二级目录,e构成了第一级目录,剩下蓝色部分就是哈希值
测试缓存服务器是否真的可以缓存
(1)资源删除测试缓存是否生效
[root@www ~]# rm -rf /usr/local/nginx/html/index.html --在后端服务器上将资源删除
[root@localhost network-scripts]# curl 192.168.179.99 --可以看到即使删除了后端服务器上的资源也还是可以从代理服务器上的缓存里拿到资源,不再去通过代理服务器去访问后端去拿index.html资源了
this is houduan fuwuqi 192.68.179.100 index.html resouce
[root@www cache]# rm -rf /data/nginx/cache/* --代理服务器删除缓存
[root@localhost network-scripts]# curl 192.168.179.99 --可以看到已经拿不到资源了
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
(2)从日志方面来观察缓存是否生效
[root@www ~]# tail -f /usr/local/nginx/logs/host.log
--这条日志是客户端192.168.179.102访问192.168.179.99时,在192.168.179.100上产生的日志。
当你再次访问代理服务器的资源时候直接去代理服务器上拿,在后端的192.168.179.102上不会产生日志记录
192.168.179.102|192.168.179.102|192.168.179.99
- - [27/Apr/2020:09:59:47 +0800] "GET / HTTP/1.0" 200 3 "-" "curl/7.29.0" "192.168.179.102"
nginx缓存服务器加强版
nginx缓存配置实例,以下配置摘自OSChina.Net官方网站的联通节点配置
#缓存存放路径
proxy_cache_path /disk2/cache/data levels=1:2 keys_zone=static:1000m inactive=600m max_size=100G;
proxy_temp_path /disk2/cache/temp;
location ~ ^/(img|css|js|uploads)/ {
proxy_buffering on;
proxy_cache static;
proxy_cache_key "$host$request_uri$is_args$args";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_cache_min_uses 1;
proxy_cache_valid 200 302 304 5m;
proxy_cache_use_stale http_502 http_503 http_504;
proxy_hide_header set-Cookie;
proxy_pass http://xxx.xxx.xxx.xxx;
include proxy.conf,gzip.conf;
}
proxy.conf配置:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
gzip.conf配置:
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/x-javascript;
缓存清理
rm -rf 缓存目录
- 使用
ngx_cache_purge
模块清理特定缓存