实现环境:rhel6.5 selinux and iptables disabled
server1: 172.25.254.1
server2: 172.25.254.2
server3: 172.25.254.3
VCL,全称Visual Component Library,是Visual Component Library的缩写,即可视组件库,它是 Delphi,C++Builder等编程语言的基本类库。
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。
varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
# vi /etc/varnish/default.vcl
###配置一个后端服务器
backend default {
.host = "172.25.254.2"; #反向代理去取数据的地方
.port = "80";
}
###配置 varnish 服务端口
# vi /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
/etc/init.d/varnish start #开启服务
修改配置vanish /etc/varnish/default.vcl
1。 查看缓存命中情况(缓存120秒清除一次,在这120秒内,显示是击中的)
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);
}
#curl -I 172.25.254.1
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 17 Feb 2018 14:44:17 GMT
ETag: "dfbcc-5-565697ed902e5"
Content-Type: text/html; charset=UTF-8
Content-Length: 5
Accept-Ranges: bytes
Date: Sat, 17 Feb 2018 14:45:27 GMT
X-Varnish: 531059509
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache #未命中
# curl -I 172.25.254.1
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Mon, 20 Aug 2012 15:22:19 GMT
ETag: "1c13aa-16-4c7b4135e08a6"
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Accept-Ranges: bytes
Date: Fri, 24 Aug 2012 14:30:54 GMT
X-Varnish: 766467033 766467032
Age: 14
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache #命中
### 通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$ #清除所有
# varnishadm ban.url /index.html #清除 index.html 页面缓存
# varnishadm ban.url /admin/$ #清除 admin 目录缓存
###定义多个不同域名站点的后端服务器
backend web1 {
.host = "172.25.254.2";
.port = "80";
}
backend web2 {
.host = "172.25.254.3";
.port = "80";
}
#当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,
访问其他页面报错。
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";
}
}
在访问的主机上面记得做好解析
# vim /etc/hosts
172.25.254.1 server1 www.westos.org bbs.westos.org
###定义负载均衡
director lb round-robin { #将多个后端聚合成一个名为lb的组,轮叫模式)
{ .backend = web1; }
{ .backend = web2; } #把多个后端聚合为一个组,并检测后端健康状况
}
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";
}
}
/etc/init.d/varnish reload
结果:输入www.westos.org的时候,会到多个聚合里面去找,web1是server2里面做的虚拟主机;输入bbs.westos.org的时候,直接找虚拟主机中的bbs
###varnish cdn 推送平台
做这个实验的时候,要把那个return(pass)注释掉,方便观察实验效果!
yum istall php -y #安装php语言环境(因为这个cdn平台是用PHP写的,要安装php环境)
# unzip bansys.zip -d /var/www/html
# vi /var/www/html/bansys/config.php #只保留如下设置,其余注释掉
$var_group1 = array(
'host' => array('172.25.254.1'),
'port' => '80',
);
//varnish 群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish 版本//2.x 和 3.x 推送命令不一样
$VAR_VERSION = "3";
?>
#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
# vi /etc/varnish/default.vcl
acl westos { #设置访问控制
"127.0.0.1";
"172.25.254.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";
}
}
## /etc/init.d/varnish restart 重启vanish服务
vim /etc/httpd/conf/httpd.conf
136 Listen 8080
/etc/init.d/httpd start
## 因为vanish监听的端口为80,所以http服务重新设定监听端口为8080,否则是起不来的。
优点:(1)Varnish访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。
(2)Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快。因而在高并发连接情况下可以支持更多TCP连接。
(3)Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
(4) squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求
缺点:(1)varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
(2) 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。