一什么是varnish
varnish是web服务器的加速器,用来提高客户访问web服务器的速度; 它被安装在web服务器之前,可以缓存web服务器的应用程序和数据,并且可以响应客户端的web请求。严格意义上说,Varnish是一个高性能的反向代理软件和HTTP加速器。
二varnish与squid对比
相同点:
都是反向代理服务器,都是开源软件
不同点:
1)varnish稳定性高。两者在相同负荷工作下,squid发生故障几率更大,因为squid需要经常重启
2)varnish访问速度更快。所有缓存数据从内存读取,而squid是从硬盘读取
3)varnish可以支持更多的并发连接。因为varnish的TCP连接释放比squid快
4)varnish可以通过管理端口,使用正则表达式批量清除部分缓存,squid不行
5)varnish在高并发下CPU、iI/O和内存等系统开销高于squid
5)varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会被发送到后端服务器,给后端造成很大压力
三VCL说明
VCL:用来定义varnish的存取策略。在配置varnish之前,首先需要了解varnish的配置语法,即vcl。
#VCL内置函数
1)vcl_recv函数:用于接收用户请求,当成功接收用户请求后被调用。通过某种动作来决定如何处理请求。
2)pipe函数:在进入pipe模式时该函数被调用,用于将客户端请求直接传递给后端服务器,在请求和返回的内容没有改变的情况下,将不变的内容直接返回给客户端。直到这个连接关闭。
3)vcl_pass函数:当vcl_recv函数执行pass动作进入pass模式时该函数被调用,用于将客户端请求直接转发给后端服务器,后端服务器响应给客户端时,不进行缓存。由于直接将请求转发给后端服务器,因此该连接下的响应数据都是最新的。
4)vcl_hit函数:该函数在执行lookup命令后,如果在缓存中找到请求数据,则自动调用该函数。
5)vcl_miss函数:该函数在执行lookup命令后,如果在缓存中没有找到请求数据,则自动调用该函数
6)vcl_fetch函数:当想从后端服务器获取数据或更新缓存时该函数被调用,并且根据某种动作来判断获取的数据是否被缓存,还是直接返回给客户端。
7)vcl_deliver函数:将请求的数据返回给客户端调用此函数。
8)vcl_timeout函数:在缓存内容到期前调用此函数。
9)vcl_discard函数:在缓存内容到期后调用此函数。
#VCL处理流程图
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
四搭建varnish
实验环境: 四台在同一局域网的主机:server1(ip:172.25.57.1) bak1(ip:172.25.57.2) bak2(ip:172.25.57.3) client(ip:172.25.57.250),server1作为varnish服务器,bak1、bak2作为两台web服务器,client为真机ip
1.下载安装包并安装:
2.修改配置文件/etc/sysconfig/varnish
#修改端口,因为varnish要缓存web服务的内容,所以侦听的端口修改为80:
#查看本机内存所支持的最大文件数
3. 系统参数配置: /etc/security/limits.conf:
在该文件中添加添加配置信息,告知服务器系统运行varniash所需要的机器性能(文件、内存、进程的大小)。一个计算机的性能( 文件、内存及进程的量级)是由硬件决定的,所以在正常生产环境中配置varnish时,服务器的硬件性能必须达到vanish运行的要求
4. 编辑配置文件: /etc/varnish/default.vcl
#修改为将要缓存的web服务器的ip地址和端口
5.开启服务,查看端口信息
五web后端服务器搭建
下载apache,编辑发布测试页面,启动服务。后端两个服务器操作相同
#测试访问varnish代理服务器:172.25.57.1
#测试成功!现在我们在其基础上添加更多功能!
六定义缓存命中情况
[root@server1 ~]# vim /etc/varnish/default.vcl
#判断缓存是否命中
sub vcl_deliver{
if(obj.hits > 0 ) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
#重新加载varnish服务,清除varnish缓存内容,测试命中情况
##通过 varnishadm 手动清除缓存
varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
#清除所有varnish缓存后,第一次没有找到请求的内容,MISS。第二次再执行请求,HIT命中
#
七定义多个不同域名站点的后端服务器
#定义2台后端服务器
backend web1 {
.host = "172.25.30.2";
.port = "80";
}
backend web2 {
.host = "172.25.30.3";
.port = "80";
}
#定义域名访问策略。如果访问域名为www.westos.org,请求交给web1处理;域名访问bbs.westos.org,请求交给web2;否则提示404错误
sub vcl_recv{
if(req.http.host ~ "^(www.)?westos.org"){
set req.http.host = "www.westos.org";
set req.backend = web1;
}elsif(req.http.host ~ "^bbs.westos.org"){
set req.backend = web2;
}else{
error 404 "westos cache";
}
}
#测试机添加本地域名解析,再测试,实现不同域名访问不同站点!
八定义负载均衡
#注意将上个实验,不同请求访问不同站点配置屏蔽
#定义director,由web1和web2后端轮询分担请求
director lb round-robin{
{.backend = web1; }
{.backend = web2; }
}
#定义访问策略。当访问www.westos.org时,轮询访问后端服务器,当访问bbs.westos.org时,仅访问站点web2;
#注意添加return (pass).清缓存(利于观测实验效果,但是此服务本就为了缓存,本末倒置)
#如果不加此,则测试时需要手动清缓存(varnishadm ban.url .*$),如果不手动,则实现不了轮寻,毕竟已有缓存,直接就访问了...
sub vcl_recv{
if(req.http.host ~ "^(www.)?westos.org"){
set req.http.host = "www.westos.org";
set req.backend = lb;
return (pass);
}elsif(req.http.host ~ "^bbs.westos.org"){
set req.backend = web2;
}else{
error 404 "westos cache";
}
}
#测试访问www.westos.org,实现轮询访问,请求bbs.westos.org时,请求交于后端web2
九定义一台主机多个域名(虚拟主机)
#在bak2上配置虚拟主机
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
136 Listen 80
1011 <VirtualHost *:80>
1012 DocumentRoot /www
1013 ServerName www.westos.com
1014 </VirtualHost>
1016 <VirtualHost *:80>
1017 DocumentRoot /bbs
1018 ServerName bbs.westos.com
1019 </VirtualHost>
#在bak2上的各个虚拟主机中配置默认发布文件
#真机测试,当访问bak2时,实际访问虚拟主机发布页面
十搭建varnish cdn 推送平台(通过管理窗口批量清缓存)
#下载解压bansys.zip,安装依赖软件,需要php支持
yum install unzip php httpd -y
unzip bansys.zip -d /var/www/html
cd /var/www/bansys/html
vim config.php
#修改http端口号为:8080,80已被varnish服务占用,开启httpd服务
#测试:在浏览器中输入172.25.57.1:8080会看到CDN推送推送界面
#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
#配置varnish主配置文件:配置acl规则
#设置访问控制
acl westos{
"127.0.0.1";
"172.25.57.250"/24;
}
#接受函数
sub vcl_recv {
if (req.request == "BAN"){
if(!client.ip ~ westos){
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
##注意:注释掉retrun (pass);
#进入网页:172.25.57.1:8080 ,选择http推送模式,.*$清所有缓存
#测试:通过查看网页头查看命中情况,原来是HIT状态,当推送成功后,varnish缓存清空,请求变成MISS下次请求则又命中!