一、varnish工作原理
varnish是一个http反向代理的缓存。它从客户端接收请求然后尝试从缓存中获取数据来响应客户端的请求,如果varnish不能从缓存中获得数据来响应客户端,它将转发请求到后端(backend servers),获取响应同时缓存到本地,最后交付给客户端。
如果varnish已经缓存了某个响应,则请求直接从varnish的缓存中获取响应。比从后端服务器去获取数据快的多
二、varnish服务器作为代理转发的过程
1、测试环境
操作系统:redhat6.5
varnish 缓存兼代理服务器:172.25.68.2 server2
varnish版本:varnish-3.0.5
backend server : 172.25.68.3 172.25.68.4
2、安装varnish
varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
3、配置
使用rpm包安装完varnish,varnish主配置文件默认在/etc/varnish下
程序功能的配置文件在/etc/sysconfig/varnish
并且会自行创建一个varnish 用户
[root@server2 ~]# cd /etc/varnish/
[root@server2 varnish]# ll
total 8
-rw-r--r-- 1 root root 3708 Sep 24 10:05 default.vcl #主配置文件
-rw------- 1 root root 37 Aug 13 09:10 secret #密钥
[root@server2 varnish]# id varnish
uid=498(varnish) gid=499(varnish) groups=499(varnish)
修改vanish监听端口
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
指定后端服务器
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.68.3";
.port = "80";
}
启动varnish
/etc/init.d/varnish start
客户端访问测试
后端服务器安装启动httpd ,并写上测试页面
[root@server3 ~]# cat /var/www/html/index.html
[root@foundation68 ~]# curl 172.25.68.2
server3
可以看到当用户访问代理服务器时,代理服务器将来自后端服务器的数据返回给了用户,接下来我们以更直接的方式去观察返回给客户端的数据是来自varnish缓存还是去后端服务器上取来的
二、检测是否命中缓存
[root@server2 ~]# vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0){
set resp.http.X-Cache = "HIT from the cathe";
}
else {
set resp.http.X-Cache = "MISS from the cathe";
}
return (deliver);
}
[root@server2 ~]# /etc/init.d/varnish restart
客户端访问测试
首次访问:
[root@foundation68 ~]# curl -I 172.25.68.2
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Mon, 13 Aug 2018 01:08:45 GMT
ETag: "9f5ab-8-57346bc2aea95"
Content-Type: text/html; charset=UTF-8
Content-Length: 8
Accept-Ranges: bytes
Date: Mon, 24 Sep 2018 04:44:17 GMT
X-Varnish: 1743176937
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from the cathe
再次访问:
[root@foundation68 ~]# curl -I 172.25.68.2
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Mon, 13 Aug 2018 01:08:45 GMT
ETag: "9f5ab-8-57346bc2aea95"
Content-Type: text/html; charset=UTF-8
Content-Length: 8
Accept-Ranges: bytes
Date: Mon, 24 Sep 2018 04:43:41 GMT
X-Varnish: 1743176936 1743176934
Age: 16
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from the cathe
清除varnish缓存
varnishadm ban.url $.* #清除所有缓存
varnishadm ban.url /index.html #清除.html文件缓存
当首次访问的时候,返回给客户端的数据来自后端web服务器(即MISS from cache),varnish会在本地缓存一份数据,当客户端再次访问的时候,会直接从varnish缓存中获取(HIT from cache),因而会给用户请求访问加速。
三、域名访问控制
通过访问不同域名实现对后端服务器的调度控制
1、指定两个后端服务器
backend web1 {
.host = "172.25.68.3";
.port = "80";
}
backend web2 {
.host = "172.25.68.4";
.port = "80";
}
2、访问控制策略
sub vcl_recv {
if (req.http.host ~ "^(www.)?yd.com") {
set req.http.host = "www.yd.com";
set req.backend = web1;
}
elsif (req.http.host ~ "^bbs.yd.com") {
set req.backend = web2;
}
else {
error 404 "yd cache";
}
}
3、客户端配置解析
172.25.68.2 server2 yd.com www.yd.com bbs.yd.com
4、测试
[root@foundation68 ~]# curl www.yd.com
server3
[root@foundation68 ~]# curl yd.com
server3
[root@foundation68 ~]# curl bbs.yd.com
server4
三、负载均衡测试
backend web1 {
.host = "172.25.68.3";
.port = "80";
}
backend web2 {
.host = "172.25.68.4";
.port = "80";
}
director lb round-robin {
{ .backend = web1;}
{ .backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?yd.com") {
set req.http.host = "www.yd.com";
set req.backend = lb;
return (pass); #由于varnish缓存,所以此处使用return(pass)参数,跳过缓存,直接去后端调取数据
}
elsif (req.http.host ~ "^bbs.yd.com") {
set req.backend = web2;
}
else {
error 404 "yd cache";
}
}
测试:
[root@foundation68 ~]# for i in {1..10}; do curl www.yd.com ; done
server3
server4
server3
server4
server3
server4
server3
server4
server3
server4
四、varnish对后端服务器的健康检查
关掉server4上的httpd服务
[root@server4 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@foundation68 ~]# for i in {1..10}; do curl www.yd.com ; done
server3
server3
server3
server3
server3
server3
server3
server3
server3
server3
由于varnish对后端服务器的健康检查作用,会将故障的服务器剔除掉
五、varnish与squid的比较
除了Varnish,Squid也是一个高性能的代理缓存服务器
下面是他们之间的相同点:
(1)都是一个反向代理服务器。
(2)都是开源软件。
下面是它们的不同点,也是Varnish的优点:
(1)Varnish更稳定。两者在完成相同负荷的工作时,Squid服务器发生故障的几率要高于Varnish,因为使用Squid要经常重启。
(2)Varnish访问速度更快。所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。
(3)Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快。因而在高并发连接情况下可以支持更多TCP连接。
(4)Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
(5) squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。
与传统的Squid相比,Varnish也是有缺点的, 1) varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。 2) 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成性能下降。