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 //数据更新