运维企业专题(1)HTTP加速器——Varnish缓存机制前篇

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会被清除缓存)

猜你喜欢

转载自blog.csdn.net/meltsnow/article/details/89314292