代理的工作机制
- 代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。
- 将获得的网页数据(静态 Web 元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应。
代理服务器的概念
代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。缓存代理对于Web至关重要,尤其对于大型高负载Web站点。缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源,如图片,css或js等进行缓存,从而在每次刷新浏览器的时候,不用重新请求,而是从缓存里面读取,这样就可以减轻服务器的压力。
代理服务器作用
资源获取:代替客户端实现从原始服务器的资源获取;
加速访问:代理服务器可能离原始服务器更近,从而起到一定的加速作用;
缓存作用:代理服务器保存从原始服务器所获取的资源,从而实现客户端快速的获取;
隐藏真实地址:代理服务器代替客户端去获取原始服务器资源,从而隐藏客户端真实信息。
常见的web缓存代理应用
- 本地实现:nginx、squid、varnish
- 云环境远端实现:CDN
Nginx 缓存代理
web 缓存代理服务器 | 172.16.26.5 |
web 应用服务器 01 | 172.16.26.30 |
web 应用服务器 02 | 172.16.26.40 |
环境准备:
systemctl stop firewalld
setenforce 0
安装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 172.16.26.30:80;
server 172.16.26.40:80;
}
server {
listen 80;
server_name www.kgc.com;
location / {
proxy_cache my_cache; #指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义
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; #设置代理转发的后端服务器的协议和地址
}
}
}
#对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
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 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
if ($request_uri ~ \.(txt|text)$) {
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; #代理转发
}
}
MISS:未命中缓存
HIT:命中缓存
EXPIRED:缓存过期
STALE:命中了陈旧缓存
REVALIDDATED:Nginx验证陈旧缓存依然有效
UPDATING:内容陈旧,但正在更新
BYPASS:X响应从原始服务器获取
测试
Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
Squid、Varinsh和Nginx都是代理服务器,他们的区别有以下几点:
- Nginx本来是反向代理/web服务器,用了插件可以做做这个副业但是本身不支持特性挺多,只能缓存静态文件。
- 从功能上讲,varnish和squid是专业的cache服务,而nginx是第三方模块完成。
- varnish本身的技术上优势要高于squid,它采用了可视化页面缓存技术,在内存的利用上,Varnish比Squid具有优势,性能要比Squid高。还有强大的通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存它是内存缓存,速度一流,但是内存缓存也限制了其容量,缓存页面和图片一般是挺好的。
- squid的优势在于完整的庞大的cache技术资料,和很多的应用生产环境。
CDN 缓存代理
CDN 概念
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。简而言之,就是将数据部署在各地的服务器中,通过负载均衡技术,让用户就近获取服务器中的数据。
CDN 原理
将源站点(Web应用服务器)的静态网页资源缓存到CDN节点上,用户请求资源时,通过与DNS的配合,找到最靠近用户的一台CDN缓存服务器,然后把资源数据快速地分发给用户,而不需要每个用户的请求都从源站点获取,从而避免网络拥塞、缓解源站点的压力,保证用户访问资源的速度和体验。
当浏览器发送请求数据时,会先去 CDN 缓存服务器获取。如果获取到数据,那么就直接返回。否则才会经过长途骨千网,最终到达网站服务器获取数据。那么只要我们提前在 CDN 缓存服务器上传数据,那么我们就可以极大地减少网络流量,同时减少网络延迟,缩短了请求数据的距离。
CDN的内容是如何获取的
- 对于热点资源,定时做缓存预热
- 如果CDN节点没有,会从上游服务器或源站点获取资源,并同步到CDN节点的缓存中