Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓 存文件来减少响应时间和网络带宽消耗。挪威最大的在线报纸Verdens Gang使用3台Varnish代替了原来的12台squid,性能比以前更好。由于Varnish可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(woker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程 进行工作,主要包括一些管理线程和很多woker线程
varnish与squid的区别:
varnish和squid在中小规模的应用上,varnish足够轻量级,足够好用,但是在巨大的并发请求来说,单个varnish所能承载的并发 访问量大概在5000个连接请求左右,超出5000个可能就不稳定了,而在这里squid就能表现出良好的性能了,并且squid拥有邻居功能,因此在大规模的企业级应用中仍然是以squid居多,而在中小规模的自己公司的反向代理缓存中varnish居多
Varnish Configuration Language(VCL)是varnish配置缓存策略的工具,它是一种基于“域”的简单变成语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达是进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用
VCL处理流程图
vcl处理过程:
(1)Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入lookup(本地查询)
(2)Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入hit状态,否则进入miss状态
(3)pass状态,在此状态下,会进入后端请求,即进入fetch状态
(4)Fetch状态,在fetch状态下,对请求进行后端的获取,发送请求
可以作缓存的内容:数据库,流媒体,页面文件,图片,css/html....
varnish搭建:
主机环境:rhel6.5镜像,selinux和iptables都必须是disabled状态
实验虚拟机:
172.25.45.1 varnish(server1)
172.25.45.2 apache(server2)
172.25.45.3 apache(server3)
1).安装varnish
在server1中下载varnish的两个rpm包
安装:yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
安装完成后,在系统的/etc/passwd中生成varnish用户,对varnish的访问控制实质上是对varnish用户的控制实现的
2).更改varnish全局配置
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 ##更改varnish服务端口为80
3)更改varnish配置文件
vim /etc/varnish/default.vcl
backend default{ ##配置一个后端服务器
.host = "172.25.45.2"; ##更改访问ip为172.25.45.2
.port = "80";
}
4.重新加载服务
/etc/init.d/varnish restart
2.在server2中
1)安装apache软件,开启服务 yum install httpd -y /etc/init.d/httpd start
2)编写默认发布文件index.html:
vim /var/www/html/index.html
server2
3)重新加载服务
/etc/init.d/httpd reload
3.测试:
物理机中打开firefox,访问172.25.45.1,看到server2即配置成功
1)更改配置文件vim /etc/varnish/default.vcl
添加
sub vcl_deliver { ##查看缓存命中情况
2).重新加载服务 /etc/init.d/varnish reload
2.测试:
物理机中: curl -I 172.25.45.1 第一次显示MISS from westos cache 缓存中没有,前往后端获取
curl -I 172.25.45.1 第二次显示HIT from westos cache 缓存中直接获取
3.通过varnish手动清除缓存
varnishadm ban.url.*$ ##清除所有缓存
varnishadm ban.url /index.html ##清除index.html页面缓存
varnishadm ban.url /admin/$ ##清除admin目录缓存
测试:
1.测试清除所有缓存
物理机中curl -l 172.25.45.1两次,使172.25.45.1缓存到cache中
server1执行varnishadm ban.url.*$ 清除所有缓存
物理机中curl -l 172.25.45.1 ,发现显示MISS from westos cache
2.测试清除index.html页面缓存
物理机中curl -I 172.25.45.1/index.html两次,使172.25.45.1/index.html缓存到cache中
server1中执行varnishadm ban.url /index.html 清除index.html页面缓存
物理机中curl -I 172.25.45.1/index.html发现显示MISS from westos cache
注意:此时如果cache中有172.25.45.1的缓存信息,使用curl -I 172.25。45.1访问时会显示HIT from westos cache,这是因为虽然curl -I 172.25.45.1和curl -I 172.25.45.1/index.html访问得到的结果一致,但是缓存到cache中的地址不同,cache缓存的是用户访问的url
curl -I 172.25.45.1访问的结果中Age表示缓存时间,默认为120s后自动清除,可在/etc/sysconfig/varnish中修改
1.server3中:
1)安装apache yum install httpd -y
启动服务/etc/init.f/httpd start
2)制作index.html
vim /var/www/html/index.html
www.linux.org
3)重新加载服务:/etc/init.d/httpd reload
2、在server2中:
1)更改index.html
vim /var/www/html/index.html
www.westos.org
2)重新加载服务:/etc/init.d/httpd reload
3.物理机中:
1)添加本地解析
vim /etc/hosts
172.25.45.1 www.westos.org www.linux.org westos.org
4.server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
##当访问westos.org域名时,自动访问www.westos.org域名
##当访问www.westos.org域名时从web1上取数据,访问www.linux.org域名时到web2取数据,访问其他页面报错
2).重新加载服务
/etc/init.d/varnish reload
5.测试:
物理机中:
curl www.westos.org
curl westos.org
发现两者得到的结果相同,均为server2中相应的index.html文件内容
curl www.linux.org
得到server3中相应的index.html文件内容
健康检查: 通过健康检查来确定服务器和应用的健康状况是负载均衡器器一个非常重要的功能。没有负载均衡器,客户端可能会将请求发送到已经停机的服务器上。网络管理员必须手动干预替换这台服务器,或者排除服务器的故障。有时服务器可能没有停机,但是因为某种原因,比如软件的漏洞,服务器上面运行的应用系统已经不能正常工作。比如Web应用可能正常运行,但它返回的页面却是错误的内容。负载均衡器能够检测这些情况并立即将客户请求导向到正常的服务器而不需要管理员的干预。
1.server3中:
1)、更改apache配置文件
vim /etc/httpd/conf/hrrpd.conf
打开 : NameVirtualHost*:80
添加:
2).建立/www/index.html
mkdir /www
vim /www/index.html
www.westos.org-server3
3).重新加载服务
/etc/init.d/httpd reload
4).配置本地解析
vim /etc/hosts
172.25.45.3 server3 www.westos.org www.linux.org
5).测试配置是否有效
curl www.linux.org
curl www.westos.org
得到相应的index.html文件中的内容
2、server1中:
1)更改varnish配置
vim /etc/varnish/default.vcl ##把多个后台聚合为一个组,并检测后端健康状况
2.重新加载配置 :/etc/init.d/varnish reload
3.测试:
1)物理机中:
curl www.westos.org 得到server2中相应的index.html文件内容
2)server1中:
varnishadm ban.url .*$清除所有缓存
3)物理机中:
curl www.westos.org 得到server3中相应的index.html文件内容
注意:还可以更改server1中varnish配置文件,添加return(pass);使得varnish缓存功能失效,客户端直接去后端抓取内容,可以获得更好的
测试对比效果
4、server1中:
1)更改varnish配置 : vim /etc/varnish/default.vcl
2).重新加载配置
/etc/init.d/varnish reload
5.测试:
物理机中:
curl www.westos.org(4次)
发现循环得到server2和server3相应的index.html内容
此时如果server2中的httpd服务关闭curl会一直读取server3相应的index.html内容而不会报错,这是因为varnish用于自动的健康检查功能。如果开启serve2中的apache服务,使用curl又能够循环读取到server2和server3相应的index.html内容
server2中:
/etc/init.d/httpd stop
物理机中:
curl www.westos.org
curl www.westos.org
发现一直得到server3相应的index.html内容
server2中:
/etc/init.d/httpd start
物理机中:
curl www.westos.org (4次)
发现循环得到server2和server3相应的index.html内容
1、server1中:
安装apache服务:yum install httpd -y
2.安装apache服务配置
vim /etc/httpd/conf/httpd.conf
listen 8080 ##避免与varnish服务端口冲突
3.下载bansys.zip包,解压并安装
yum install unzip -y ##6.5中没有unzip命令,需要安装
unzip bansys.zip -d /var/www/html
4.将解压出来的目录中的文件移动到/var/www/html
cd /var/www/html/bansys/
mv * ..
5.安装php服务 ; yum install php -y
6.开启apache服务:/etc/init.d/httpd start
7.更改php服务配置文件
cd /var/www/html
vim config.php
注意:bansys有两种工作模式,分别是:telent和http模式
telent模式需要关闭varnish服务管理端口的验证,注释掉/etc/sysconfig/varnish文件中的“-S ${VARNISH_SECRET_FILE}”
这行,重启服务即可
如果是http模式需要对varnish做以下设置(本次实验采用http模式推送)
8.更改varnish配置文件
vim /etc/varnish/default.vcl ##添加acl westos 在sub vcl_recv{}中添加 删除return(pass);
9.重新加载varnish服务
/etc/init.d/varnish reload
10.测试:
物理机中:
用firefox访问www.westos.org
打开另外一个网页,用firefox访问172.25.45.1:8080
推送模式:HTTP
CDN群组;www.westos.org
推送内容:/index.html ###是一个文件
/images/* ##是一个目录
本次实验推送文件/index.html