#######################################################
varnish
一、varnish是用来干什么的:
varnish作用是访问web速度的web加速器,被安装在web服务器之前,从而缓存web服务器的应用程序和数据,最后相应客户的请求。 功能与Squid服务器相似,都可以用来做HTTP缓存。
与Squid不同之处在于,Squid是从硬盘读取缓存的数据,而Varnish把数据存放在内存中,直接从读取内存,避免了频繁在内存、磁盘中交换文件,所以Varnish要相对更高效,但也有缺点,内存中的缓存在服务器重启后会丢失
二、
1.Varnish的初始化过程:
varnish启动会产生两个进程:master进程 和 child进程
master进程:master进程负责启动工作,master进程会读取配置文件,根据指定的配置信息做出相应的动作,例如管理员在配置文件中分配了2G内存大小,它就会在内存中创建2G的存储空间; master进程还会创建并管理child进程。
child进程: child进程来处理后续任务,它会分配一些线程来执行不同的工作,例如:(1). 接受http请求 (2).为缓存对象分配存储空间 (3).清除过期缓存对象(4). 释放空间 碎片整理
2. 分配缓存过程:有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去
如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块
如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则。
3.释放缓存过程:有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间; 释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理
4.VCL(varnish configuration Langage)语言 相关:
1)
VCL语言被使用在default.vcl这个文件中,用来设置varnish服务器对后端web服务器加速的一些规则; vcl是一种区域配置语言。在执行vcl时,varnish会将vcl语言转化未二进制代码; default.vcl文件中的vcl语言被分为多个子程序, 不同的子程序在不同的时间点执行,比如有的子程序在接收到客户端请求时执行,有的子程序在接收到后端服务器的文件时执行。
2) backend servers(后端服务器)
一般来说就代表web服务器,提供varnish加速的内容,即varnish缓存内容的源头。
在/etc/varnish/default.vcl文件中会配置相关信息和规则,告诉varnish服务器应该去哪里寻找缓存的内容
3)vcl_recv
该子程序在请求的开始被调用,在接收、解析了客户端的请求后,该子程序会决定是否响应请求、怎么响应请求以及使用哪个后台服务器响应请求。
4)actions:
主要有一下动作 :
pass:当一个请求被 pass 后,这个请求将通过 varnish 转发到后端服务器,
但是它不会被缓存。pass 可以放在 vcl_recv 和 vcl_fetch 中。
lookup:当一个请求在 vcl_recv 中被 lookup 后,varnish 将从缓存中提取数
据,如果缓存中没有数据,将被设置为 pass,不能在 vcl_fetch 中设置 lookup。
pipe:pipe 和 pass 相似,都要访问后端服务器,不过当进入 pipe 模式后,在
此连接未关闭前,后续的所有请求都发到后端服务器
deliver:请求的目标被缓存,然后发送给客户端
5)3个重要的数据结构:Requests、Responses 、 objects
req:请求目标,当 varnish 接收到一个请求,这时 req object 就被创建了,
你在 vcl_recv 中的大部分工作,都是在 req object 上展开的。
beresp:后端服务器返回的目标,它包含返回的头信息,你在 vcl_fetch 中的
大部分工作都是在 beresp object 上开展的。
obj:被 cache 的目标,只读的目标被保存于内存中,obj.ttl 的值可修改,其
他的只能读。
6)两个varnish服务器上的监控命令:
varnishlog
varnishtop
三、搭建varnish服务器,实现简单的web缓存:
1. 下载相关软件:
2. 编辑/etc/sysconfig/varnish
1) 修改端口
2) 看varnish 对文件、内存、进程的限定
对比真机对文件、内存、进程的限制 sysctl -a | grep file/mem/ 或者直接用ulimit -a查看
3. 编辑配置文件: /etc/security/limits.conf
在该文件中添加运行varniash所要求的文件、内存、进程的大小,
一个计算机 文件、内存及进程的量级是由硬件决定,
所以在正常生产环境中配置varnish时,硬件必须达
到vanish运行的要求。
4. 编辑配置文件: /etc/varnish/default.vcl
添加要备份的服务器主机的ip和访问的端口
5. 开启varnish服务
这时候若正常,varnish会开启两个进程,一个由root用户开启,一个由
varnish用户开启,root用户是门迎, varnish用户相当于大堂经理
,一个负责监听,一个负责分工作线程,若有客户来访问则分一个子线程
去访问varnish服务器
6. 在另外一台虚拟机上开启http服务
7. 测试 curl 172.25.9.2
四、 测试客户端是否命中实验:
1. 配置文件 /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit from server3 cache";
}
else {
set resp.http.X-Cache = "Miss from server3 cache";
}
return (deliver);
}
2. 重新载入varnish服务:
etc/init.d/varnish reload
切忌:不能重启服务,要载入服务,重启服务会清除掉缓存信息
3. 测试 curl -I 172.25.9.2
第一次:X-Cache: Miss from server3 cache
Age: 0
第二次:X-Cache: Hit from server3 cache
Age: 4
五、 如何更新缓存:
1. 手动清除缓存:
varnishadm ban.url .*$
2.自动清除缓存: vim /etc/sysconfig/varnish
VARNISH_THREAD_TIMEOUT=120(默认是120s)
有问题:动态其实没做明白,配置后不自动清除缓存
六、 如何配置varnish,让其实现多个web服务器的访问加速:
1. 配置文件: /etc/varnish/default.vcl
## 配置对第一个web服务器进行缓存
backend web1 {
.host = "172.25.9.3";
.port = "80";
}
## 配置对第二个web服务器进行缓存
backend web2 {
.host = "172.25.9.4";
.port = "80";
}
##用正则进行匹配:
sub vcl_recv {
if (req.http.host ~ "^(www.)?245room.org") {
set req.http.host = "www.245room.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.245room.org") {
set req.backend = web2;
} else {error 404 "245room cache";
}
}
2. 在客户端配置解析
vim /etc/hosts
172.25.9.2 server1 www.245room.org bbs.245room.org hello.org
3. 测试:
curl www.245room.org
curl bbs.245room.org
六、 定义后端服务器的负载均衡:
1. 配置文件:/etc/varnish/default.vcl
#
backend web1 {
.host = "172.25.9.3";
.port = "80";
}
backend web2 {
.host = "172.25.9.4";
.port = "80";
}
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?245room.org") {
set req.http.host = "www.245room.org";
set req.backend = lb;
return (pass);
} elsif (req.http.host ~ "^bbs.245room.org") {
set req.backend = web1;
} else {error 404 "245room cache";
}
}
问题: 若是轮询的方式去实现负载均衡,是否就要放弃varnish缓存的功能
2. 测试
[root@foundation9 images]# curl www.245room.org
server 2
[root@foundation9 images]# curl www.245room.org
server4
[root@foundation9 images]# curl www.245room.org
server 2
[root@foundation9 images]# curl www.245room.org
server4