什么是varnish/h3>
官方解释:
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器。
CDN的全称是Content Delivery Network,即内容分发 络。其基本思路是尽可能避开互联 上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在 络各处放置节点服务器所构成的在现有的互联 基础之上的一层智能虚拟 络,CDN系统能够实时地根据 络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 络拥挤的状况,提高用户访问 站的响应速度。
其中有两个点:
1、方向代理服务器
2、http加速器
搭建CDN的方式
市面上有很多CDN供应商,比较著名有Akamai (全球最大),chinacache,webluker,cloudflare,chinacache,如果需要自己搭建CDN系统,有3种主流方案可以选择squid,varnish,Nginx+memcache
varnish和squid的区别
之前的squid加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的硬盘里,客户读取的速率很慢,代理的效率低。
现在的varnish加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的内存里,客户读取的速率很快,代理的效率高。
varnish的工作原理
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要 做cache的工作)进程。
master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
针对文件缓存部分,master读入存储配置,调用合适的存储类型,然后创建/读入相应大小的缓存大文件。
接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。
在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中
(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap)
此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。
接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,
然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,
如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。
为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。
然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。
如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。
如果缓存已满,就根据LRU机制,把最旧的object释放掉。
释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期
如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存
注意释放时会检查该存储内存块前面或后面的空闲内存块
如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。
整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中
如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。
varnish的工作方式
1、作为代理以及具有缓存作用的功能
2、只作为一个代理服务器工作
部署单个varnish服务器
1、安装3个虚拟机;采用的是创建快照的方式进行创建多个虚拟机。
2、安装varnish软件
sysctl -a | grep file查看系统允许开启文件的最大个数
多台后端http服务器,varnish实现负载均
图形化清除缓存
server1上:
安装http,编写配置文件:
yum install httpd -y
systemctl start httpd
此时的vainish是默认会缓存每一个访问到的资源
vim /etc/varnish/default.cvl
写入权限列表:
acl westos{
“127.0.0.1”;主机自己
“172.25.12.0”/24;这个 段的所有主机都有权限清理代理服务器上面的缓存
}
再写入:
if (req.method == “BAN”) {
if (!client.ip ~ westos) {
return (synth(405,“Not allowed.”));
}如果不是允许的ip就拒绝清理
ban(“req.url ~ ” + req.url);
return(purge);如果是就清理缓存
}
注释:return(pass),这个会一直清除缓存,之前的实验做的
清除这个代理服务器就不会缓存资源了,直接从服务器请求资源给客户端
systemctl restart varnish
测试:
curl -I www.westos.org 是miss
curl -I www.westos.org 是hit
curl -I www.westos.org 是hit
然后图形化清除缓存,输入.*,发送(清除所有缓存)

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!