目录
一、Web缓存代理
1.作用
存储一些之前给访问过的,且可能要被再次访问的静态网页资源对象,使客户端可以直接从缓存代理服务器获取资源,从而减少上游源服务器的负载压力,加快网站的整体访问速度。
代理服务器还可以代替客户端去获取源服务器的资源,从而隐藏客户端的真实地址。
2.Web代理工作机制
缓存网页对象,减少重复请求
3.常见的Web缓存代理应用
●本地实现 Nginx Squid Varnish
●云环境远端实现 CDN
数据库缓存代理:Redis Memcached
Nginx 配置 缓存代理
http {
......
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
# 缓存目录 目录层级 缓存共享内存区的名称和大小 缓存数据上限 缓存失效时间 是否存放临时文件
upstream XXXX {
server IP:PORT; #定义上游源服务器的IP和端口
.....
}
server {
listen IP:PROT;
server_name 主机名;
location 匹配路径 {
proxy_cache my_cache; #指定缓存共享内存区的名称
proxy_cache_valid 200 60m; #指定有效缓存的状态码 缓存时间;
proxy_cache_key $request_uri; #指定缓存数据的key为请求的URL
add_header Nginx_Cache_Status $upstream_cache_status #添加请求头显示缓存状态
proxy_pass http://XXXX; #设置没有命令缓存时的代理转发
proxy_no_cache $自定义变量; #通过判断自定义变量是否有值来决定是否进行缓存
}
}
}
二、Nginx缓存配置
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
●path:强制参数,指定缓存文件的存放路径。
●levels:定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最多256种选择,00-ff)表示,中间用 : 分隔。
proxy_cache_path /data/nginx/cache; 代表所有缓存只有一个目录,比如/data/nginx/cache/d7b6e5978e3f042f52e875005925e51b
proxy_cache_path /data/nginx/cache levels=1:2; 代表缓存是二层目录(有16*256=4096个目录),比如/data/nginx/cache/b/51/d7b6e5978e3f042f52e875005925e51b
●keys_zone:强制参数,定义共享内存区的名称和大小,该共享内存用于保存缓存项目的元数据(所有活动的key和缓存数据相关的信息),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key。
●inactive:删除指定时间内未被访问的缓存文件,默认10分钟。
●max_size:设置了缓存存储的上限,如果不指定,最大会用掉所有磁盘空间。
●use_temp_path:直接把临时文件放在缓存目录中。
upstream cache_server{
server 192.168.80.20:80;
server 192.168.80.30:80;
}
server {
listen 80;
server_name www.xy101.com;
location / {
proxy_cache my_cache; #指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义
proxy_cache_valid 200 60m; #为不同的响应状态码设置不同的缓存时间,此为缓存状态码为200的请求,缓存时长为60分钟
proxy_cache_key $request_uri; #指定缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status #把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; #设置代理转发的后端服务器的协议和地址
}
}
}
注意:对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,以下是配置不缓存的内容。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.lion.club;
#URI 中后缀为 .php 或 .jsp 的设置变量值为 "no cache"
if ($request_uri ~ \.(php|jsp)$) {
set $cache_name "no cache"
}
location / {
proxy_no_cache $cache_name; #判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
proxy_cache my_cache; #设置缓存内存
proxy_cache_valid 200 5m; #缓存状态为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; #缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status #把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; #代理转发
}
}
三、CDN 内容分发网络
1.作用
在最接近用户的网络边缘增加一层CDN缓存代理服务器,将源站点服务器的内容发布到CDN做缓存,可以使用户就近取得所需的内容,从而提高用户访问网站的响应速度。
总结一句话为CDN能够给Web网站内容做缓存,还可降低网络延迟。
2.工作原理
先将源站点服务器的静态网页资源缓存到CDN节点上,用户请求资源时,通过与DNS的配合,再根据用户的IP地址和请求的URL,找到最靠近用户的CDN节点,然后CDN节点会将资源数据快速地分发给用户,使每用户的请求不需要都从源站点服务器获取。从而避免了网络拥塞,降低了源站点服务器的负载压力,提高用户访问资源的速度和体验。
3.CDN的内容是如何获取到的?
1)让用户直接访问资源,如果CDN有资源则可以命中缓存并直接响应返回给用户;如果没有命中到缓存则会将请求发送给上游源站点服务器获取资源,并同步到CDN的缓存中
2)对于热点资源,可以先做缓存预热,再让用户访问资源,即可命中CND中的缓存并直接响应返回给用户