1.简介
1)CDN 加速缓存有两种方式Squid与Varnish,为什么选择了Varnish?
Varnish是一款高性能的开源HTTP加速器,Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。
Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失。
2)Varnish 如何工作?
- 初始化过程
Varnish 的master进程负责启动工作,master进程读取配置文件,根据指定的空间大小(例如管理员分配了2G内存)来创建存储空间,创建并管理child进程,child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如
接受http请求
为缓存对象分配存储空间
清除过期缓存对象
释放空间 碎片整理
-
http请求处理过程
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求
工作线程会分析http请求的uri,知道了这个请求想要什么,就到缓存中查找是否有这个对象
如果有,就把缓存对象直接返回给用户
如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户 -
分配缓存过程
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去
如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块
如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则 -
释放缓存过程
有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间
释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理
2.环境搭建
1)准备三个虚拟机,我们这里使用的是rhel6.5的镜像
2)搭建一个6.5版本的网络共享yum源
具体过程这里不再详述(可参考作者前面的博客,有详述)
3.实验一:varnish的反向代理
实验设备:
主机 | IP | 服务 | 作用 |
---|---|---|---|
server1 | 172.25.6.1 | varnish | 调度器 |
server2 | 172.25.6.2 | apache | 后端服务器 |
server3 | 172.25.6.3 | apache | 后端服务器 |
实验目的:server1:作代理;server2:作被访问的主机
实验步骤:
server1上相关配置
<1>获得varnish包资源,并安装
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
rpm -qc varnish-3.0.5-1.el6.x86_64(查看配置文件)
<2>打开varnish配置文件,可以看到最大能打开的文件数为131072,最多能使用的内存空间为82000K,也就是82M,单个用户能运行的最大线程数不受限制,默认端口为6081
vim /etc/sysconfig/varnish
最大打开文件个数:(NFILES=131072)
内存需求:(MEMLOCK=82000)
进程数:(NPROCS="unlimited")不限制
查看系统内存信息以及能打开的最大文件数,看是否能支持服务所能打开的最大文件数(顺便说一下,如果你的server1是按照作者前面博客中设置来,即设置内存大小为2048M,这里就不会有问题)
ulimit -a #查看系统内存信息
sysctl -a | grep file #查看系统支持打开的最大文件数——188465
当然如果像上图一样不够也没关系,打开虚拟机管理器进行添加就好了
修改服务的默认端口为80
<3>修改varnish用户的限制文件——在文件末尾添加信息
vim /etc/security/limits.conf
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
<4>在varnish配置文件中配置一个后端服务器
vim /etc/varnish/default.vcl
7 backend default {
8 .host = "172.25.6.2";
9 .port = "80";
10 }
重启服务
/etc/init.d/varnish restart
netstat -antlp | grep 80(查看端口)
系统中产生了varnish用户的进程,这里root开启的是master进程,不接受请求,用来监控子进程
ps aux
server2上相关配置
<1>安装apache
<2>编写一个apache的测试页
<3>开启apache服务
/etc/init.d/httpd start
测试:
打开物理机的浏览器访问172.25.6.1,出现server2的测试页
反向代理实验完成!
4.实验二:查看访问到的网页是否为缓存
vim /etc/sysconfig/varnis
TIMEOUT=120 #默认调度器server1会在120秒后清除后端服务器server2缓存
1)在调度器server1中的配置文件中编辑是否命中后的反馈信息
vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache"; ##在varnish缓存中命中访问的域名
}
else {
set resp.http.X-Cache = "MISS from westos cache"; ##在后端服务器中获得
}
return (deliver);
}
2)重新加载服务
/etc/init.d/varnish reoad
注意:
如果请求发出后访问的结果是MISS from westos cache就表示数据调度器server1是从后端服务器获得的
如果返回的是HIT from westos cache就表示是在调度器的缓存中获得的
3)物理机上测试:
curl -I 172.25.6.1 ##发送访问请求
第一次访问:距离上个实验访问该网页也过去超过120秒,调度器自动清理了缓存,因此第一次访问调度器需要从后端服务器上获取数据然后给客户端(物理机)
第二次访问:数据是从调度器上得到的
为了排除干扰,将server1 中所有缓存清除在测试
varnishadm ban.url .*$
第一次访问:
第二次访问:
第三次访问:
4)访问172.25.6.1/index.html
先访问一次172.25.6.1(调度器),缓存已存在
继续访问172.25.6.1/index.html
注意:上述过程说明curl -I 172.25.6.1和curl -I 172.25.6.1/index.html 是完全不同的两个资源
清理代理的缓存信息
varnishadm ban.url .*$ #清除所有缓存
varnishadm ban.url /index.html #清除url部分,可能并不会达到效果(再次执行清除所有的命令)(客户端通过 curl 172.25.8.1/index.html会被清除缓存)