一、web缓存代理
web代理的工作机制
代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并指定目标原始服务器,然后代理服务器向原始服务器转交请求,并将获得的内容返回给客户端。
缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源,如图片、css或js等进行缓存,从而在每次刷新浏览器的时候,不用重新请求,而是从缓存里面读取,这样就可以减轻服务器的压力。
代理服务器主要作用
- 资源获取:代替客户端实现从原始服务器的资源获取;
- 加速访问:代理服务器可能离原始服务器更近,从而起到一定的加速作用;
- 缓存作用:代理服务器保存从原始服务器所获取的资源,从而实现客户端快速的获取;
- 隐藏真实地址:代理服务器代替客户端去获取原始服务器资源,从而隐藏客户端真实信息。
常用的代理服务器
- 本地实现:squid、nginx、varnish
- 云环境远端实现:CDN
- 数据库缓存代理:Redis、Memcached
搭建web缓存代理
1、在三台服务器上部署nginx
- 192.168.10.101
- 192.168.10.103
- 192.168.10.109
初始化
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
下载nginx的yum源安装
[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# ls
local.repo repos.bak
[root@localhost yum.repos.d]# ls
local.repo nginx.repo repos.bak
[root@localhost yum.repos.d]# yum install -y nginx
2、在后端原始服务器上创建测试页面
在192.168.10.103上创建测试页面
在192.168.10.109上创建测试页面
3、完成nginx服务器配置修改
先关闭两台测试机的长连接并重启服务
vim /etc/nginx/nginx.conf
systemctl restart nginx
创建数据缓存目录
mkdir /data/nginx/cache -p
chown nginx:nginx /data/nginx/cache/
开启nginx缓存配置
vim /etc/nginx/nginx.conf
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
/data/nginx/cache:
这是缓存文件在文件系统中的存储路径。NGINX 将在该目录下存储缓存文件。
levels=1:2:
1:2 表示缓存文件将分两级目录存储。第一层有一个字符,第二层有两个字符。这种结构可以避免单个目录下文件过多的问题,提高文件查找效率。
keys_zone=my_cache:10m:这定义了缓存区域的名称和大小。my_cache 是缓存区域的名称,用于在其他指令中引用该缓存。
10m 表示分配给该缓存区域的内存大小为10MB。NGINX 在内存中保存缓存项的元数据(如缓存键和过期时间),实际的缓存内容存储在磁盘上。
max_size=10g:
这定义了缓存的最大磁盘空间为10GB。当缓存达到这个大小时,NGINX 会自动删除最老的缓存项以腾出空间。
inactive=60m:
这定义了缓存项的非活动时间。60m 表示如果缓存项在60分钟内未被访问,则会被删除。
这个参数帮助清理长期不使用的缓存项。
use_temp_path=off:
这指示 NGINX 在写入缓存文件时,直接写入目标目录,而不使用临时目录。设置为 off 可以提高性能,因为省去了临时目录到目标目录的文件移动操作。
继续在nginx.conf中加入配置,定义一个上游服务器组
修改default.conf文件
vim /etc/nginx/conf.d/default.conf
systemctl restart nginx
配置项解释:
1、proxy_cache my_cache:
该指令启用了名为 my_cache 的缓存区域。这个缓存区域在 proxy_cache_path 指令中定义。
2、proxy_cache_valid 200 60m:
该指令设置缓存时间。具体来说,它指定了 HTTP 200 响应(成功响应)的缓存时间为60分钟。
3、proxy_cache_key $request_uri:
该指令定义缓存键,用于确定缓存条目的唯一标识。
4、add_header Nginx-Cache-Status $upstream_cache_status:
该指令添加一个自定义 HTTP 头部 Nginx-Cache-Status,其值为 $upstream_cache_status。
$upstream_cache_status 是一个内置变量,用于指示缓存状态。它可以是以下值之一:
- MISS:请求没有命中缓存。
- BYPASS:缓存被绕过。
- EXPIRED:缓存条目已过期,需要重新获取。
- STALE:使用陈旧的缓存条目。
- UPDATING:缓存条目正在更新。
- REVALIDATED:缓存条目被重新验证。
- HIT:请求命中缓存。
5、proxy_pass http://webservers
该指令将请求代理到上游服务器组 webservers。
webservers
已经在上述upstream
块中定义
4、验证
在访问之前cache缓存中没有文件
cd /data/nginx/cache
ls
在网页中进行访问
第一次访问没有命中,会在缓存区生成缓存文件,之后继续访问即可直接命中
总结:
Web缓存代理
作用:存储一些之前给访问过的,且可能要被再次访问的静态网页资源对象,使客户端可以直接从缓存代理服务器获取资源,从而减少上游源服务器的负载压力,加快网站的整体访问速度。
代理服务器还可以代替客户端去获取源服务器的资源,从而隐藏客户端的真实地址。
常见的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 $自定义变量; #通过判断自定义变量是否有值来决定是否进行缓存
}
}
}
二、CDN内容分发网络
CDN概述
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的cache(缓存)层,将网站的内容发布到最接近用户的网络“边缘”节点,使用户可以就近取得所需的内容(就近原则),提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度。
CDN优势
- CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
- 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。
工作原理
将源站点(web应用服务器)的静态网页资源缓存到CDN节点上,用户请求资源时,就近返回
CDN节点上缓存的资源,而不需要每个用户的请求都从源站点获取,从而避免了网络拥塞,缓解
了源站点的压力,提高用户访问资源的速度
1、浏览器发起图片 URL请求,经过本地 DNS解析,会将域名解析权交给域名 CNAME 指向的CDN 专用 DNS 服务器。
2、CDN的DNS 服务器将 CDN的全局负载均衡设备IP 地址返回给浏览器
3、浏览器向 CDN全局负载均衡设备发起 URL 请求
4、CDN 全局负载均衡设备根据用户IP 地址,以及用户请求的 URL,选择一台用户所属区域的区域负载均衡设备,向其发起请求。
5、区域负载均衡设备会为用户选择最合适的 CDN 缓存服务器(考虑的依据包括: 服务器负载
情况,距离用户的距离等),并返回给全局负载均衡设备.
6、全局负载均衡设备将选中的 CDN 缓存服务器IP地址返回给用户。
7、用户向 CDN 缓存服务器发起请求,缓存服务器响应用户请求,最终将用户所需要偶的内容返回给浏览器。
使用 CDN 服务的网站,只需要将域名解析权交给 CDN 服务商,接着将需要分发的内容上传到CDN,就可以实现内容加速了.
CDN的内容是如何获取到的?
1)让用户直接访问资源,如果CDN有资源则可以命中缓存并直接响应返回给用户;如果没有命中到缓存则会将请求发送给上游源站点服务器获取资源,并同步到CDN的缓存中
2)对于热点资源,可以先做缓存预热,再让用户访问资源,即可命中CND中的缓存并直接响应返回给用户