varnish的工作原理、配置、负载均衡及定点清除

1、varnish的工作过程

这里写图片描述
处理过程大致分为如下几个步骤:
(1)Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或 Pipe,或者进入Lookup(本地查询)。
(2)Lookup状态,进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进 入miss状态。
(3)Pass状态,在此状态下,会进入后端请求,即进入fetch状态。 (4)Fetch状态,在Fetch状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地 的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

2、varnish的配置

实验主机:
- 172.25.29.1 server1 varnish
- 172.25.29.2 server2 apache
-172.25.29.3 server3 apache

###server1:
[root@server1 ~]# ls
varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]# yum install * -y //安装        
[root@server1 ~]# cd /etc/varnish 
[root@server1 varnish]# /etc/init.d/varnish start       #开启varnish服务
[root@server1 varnish]# vim /etc/sysconfig/varnish 
 8 NFILES=131072
12 MEMLOCK=82000
15 NPROCS="unlimited"
66 VARNISH_LISTEN_PORT=80   #修改端口为80,为了时方便
82 ARNISH_THREAD_TIMEOUT=120 #表示缓存的期限的120s

[root@server1 varnish]# /etc/init.d/varnish restart 
[root@server1 varnish]# netstat -antlp|grep varnish
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1559/varnishd       
tcp        0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      1558/varnishd       
tcp        0      0 :::80                       :::*                        LISTEN      1559/varnishd 
[root@server1 ~]# sysctl -a|grep file  //内核对最大文件数的限制
[root@server1 ~]# ulimit -a    //显示当前的各种用户进程限制
[root@server1 varnish]# vim /etc/security/limits.conf 
#添加系统环境设置,对varnish用户进行限制
varnish         -       nofile          131072
varnish         -       memlock         82000
varnish         -       nproc          unlimited
[root@server1 varnish]# vim default.vcl 
backend default {
  .host = "172.25.29.2";    #修改为实际后台服务器的ip
  .port = "80";
}
[root@server1 varnish]# /etc/init.d/varnish reload  #重新加载
###server2:
[root@server2 html]# /etc/init.d/httpd start
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
[root@server2 html]# vim  index.html    #编写httpd默认的发布页
www.westos.org
###浏览器测试:

可以看到httpd的默认发布页内容
这里写图片描述

3、手动清除varnish缓存
###主机:
[root@foundation29 Desktop]# vim /etc/hosts #本地解析
172.25.29.1 www.westos.org
###server1:
[root@server1 varnish]# varnishadm ban.url /index.html  
#清除index.html页面
###主机测试:
[root@foundation29 images]# curl www.westos.org/index.html -I
Age: 0
###server1:
[root@server1 varnish]# varnishadm ban.url .*$     #清除所有
###主机测试:
[root@foundation29 images]# curl www.westos.org -I
Age: 0
[root@foundation29 images]# curl 172.25.29.1 -I
Age: 0
4、定义多个不同站点的后端服务器
###server3:
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html         #编写httpd默认的发布页
bbs.westos.org
###server1:
[root@server1 varnish]# vim default.vcl 
backend web1 {
  .host = "172.25.29.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.29.3";
  .port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {  
//^(www)?表示是否加www都缓存一条,减小缓存空间的使用
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";
}
}
[root@server1 varnish]# /etc/init.d/varnish reload
###主机:
[root@foundation29 images]# vim /etc/hosts
172.25.29.1 www.westos.org       bbs.westos.org         westos.org
[root@foundation29 images]# curl www.westos.org -I
[root@foundation29 images]# curl westos.org -I
[root@foundation29 images]# curl bbs.westos.org -I
[root@foundation29 images]# curl 172.25.29.1 -I     //404报错
HTTP/1.1 404 westos cache

当访问 www.westos.org (westos.org)域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错

5、负载均衡
###server3:
[root@server3 www1]# vim /etc/httpd/conf/httpd.conf 
 990 NameVirtualHost *:80           #开启80端口
1010 <VirtualHost *:80>
1011     DocumentRoot /var/www/html
1012     ServerName bbs.westos.org
1013 </VirtualHost>
1014 
1015 <VirtualHost *:80>
1016     DocumentRoot /www1
1017     ServerName www.westos.org
1018 </VirtualHost>
[root@server3 html]# mkdir /www1
[root@server3 html]# cd /www1
[root@server3 www1]# vim index.html
www.westos.org - server3
[root@server3 www1]# /etc/init.d/httpd restart
###server2:
[root@server2 html]# vim  index.html
www.westos.org - server2
###server1:
[root@server1 varnish]# vim default.vcl
director westos round-robin {   //westos负载均衡器,round-robin支持的算法
{.backend = web1;}
{.backend = web2;}
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = westos;   //访问(www).westos.org域名时,查看westos负载均衡器
#return(pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
[root@server1 varnish]# /etc/init.d/varnish reload

(1)加上return(pass)时,表示不进行缓存,方便测试,测试结果如下:


[root@foundation29 ~]# curl www.westos.org 
www.westos.org - server2
[root@foundation29 ~]# curl www.westos.org 
www.westos.org - server3
[root@foundation29 ~]# curl www.westos.org 
www.westos.org - server2
[root@foundation29 ~]# curl www.westos.org 
www.westos.org - server3
[root@foundation29 ~]# curl www.westos.org -I
Age: 0      #不进行缓存,每次刷新都是0

(2)不加return(pass)时,进行缓存,主机测试:

[root@foundation29 ~]# curl www.westos.org/index.html  
www.westos.org - server2            //此时读取的缓存是server2的
[root@foundation29 ~]# curl www.westos.org/index.html -I
Age: 118            //Age会增加
[root@foundation29 ~]# curl www.westos.org/index.html
www.westos.org - server3    #Age到120s时,开始读取server3的缓存

#server1清理缓存,主机测试也会server2和server3轮询

[root@server1 varnish]# varnishadm ban.url /index.html  
[root@foundation29 images]# curl www.westos.org/index.html
www.westos.org - server3
[root@server1 varnish]# varnishadm ban.url /index.html
[root@foundation29 images]# curl www.westos.org/index.html
www.westos.org - server2
6、定点清除

当后端服务器数据更改,而varnish缓存还未过期时,客户端访问时将不能访问到最新数据,为了解决这个问题,可以对变更的数据进行定点清除。

###Server1:
[root@server1 ~]# ls
bansys.zip 
[root@server1 ~]# yum install php unzip httpd -y
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf 
 136 Listen 8080                //修改端口,防止和varnish服务端口冲突
[root@server1 ~]# /etc/init.d/httpd start
[root@server1 ~]# cd /var/www/html
[root@server1 html]# netstat -antlp
tcp        0      0 :::8080                     :::*                        LISTEN      1244/httpd  
[root@server1 html]# ls
bansys  class_socket.php  config.php  index.php  purge_action.php  static
[root@server1 html]# vim config.php 
<?php

 //varnish主机列表
 //可定义多个主机列表
 $var_group1 = array(
                        'host' => array('172.25.29.1'),  //varnish主机ip
                                                'port' => '80',   #varnish端口         
                    );

 //varnish群组定义
 //对主机列表进行绑定
 $VAR_CLUSTER = array(
                         'www.westos.org' => $var_group1,      
                     );

 //varnish版本
 //2.x和3.x推送命令不一样
 $VAR_VERSION = "3";

?>

[root@server1 html]# cd /etc/varnish/
[root@server1 varnish]# vim default.vcl 
acl westos {
"127.0.0.1";        //本机,回环接口
"172.25.29.0"/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";
}

[root@server1 varnish]# /etc/init.d/varnish reload
###浏览器:

这里写图片描述
注意:这里的推送模式是http

###主机测试:

[root@foundation29 ~]# curl www.westos.org/index.html
www.westos.org - server3

###推送成功后:

[root@foundation29 ~]# curl www.westos.org/index.html
www.westos.org - server2 //数据更新

猜你喜欢

转载自blog.csdn.net/yyyxxxs/article/details/81633729