1、varnish概述
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸Verdens Gang (http://www.vg.no)使用3台Varnish代替了原来的12台squid,性能居然比以前更好。
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了cpu内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部分的工作应该交给操作系统处理,这就是Varnish cache设计架构。
2、varnish基础概念详解
监听端口号: 6081
官方网站:
https://www.varnish-cache.org/
下载:
http://varnish-cache.org/releases/index.html
2.1比起squid更加轻量级,大致有以下几个特点:
2.2可以基于内存缓存,也可以在磁盘上缓存
2.3如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或使用SSD X 2 做RAID1避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘
2.4可以利用虚拟内存方式,IO性能会非常好
2.5支持设置0-60秒 精确缓存时间
3、支持VCL
其配置是通过vcl编程语言来完成的。其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC临时的编译vcl配置的,编译完之后才能运行起来。
注: Varnish Configuration Language - VCL(varnish配置语言-VCL)。
Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。
VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。
4、独特的日志存储及管理机制
日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率,当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如varnishshtopvarnishlog等命令工具用来查看日志信息。
5、支持使用varnish状态引擎
通过巧妙的状态引擎的设计完成不同的引擎对用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则,完成缓存处理、完成代理处理等等
6、varnish 缓存原理
varnish缓存数据机制:
处理过程大致分为如下几个步骤:
6.1.Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)。
6.2Lookup状态,在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;进入此状态后,会在hash表中查找数据,若找到,则进入Hit(命令中)状态,否则进入miss(没命中)状态。
6.3Pass状态,在此状态下,会进入后端请求,即进入fetch取状态。
6.4Fetch状态,在Fetch取状态下,对请求,进行后端的获取,发送请求,获得数据,并进行本地的存储。
6.5Deliver提供状态,将获取到的数据发送给客户端,然后完成本次请求。
注:
pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;
总结: 用户通过varnish加速时,有4线路可以获得数据。
7、实战:缓存一个网站
7.1实战:配置docker-01成为varnish服务器加速docker-02 web服务器
通过CDN加速WEB网站
网宿,蓝讯
智能DNS
[root@docker-01 ~]# yum install varnish
[root@docker-01 ~]# vim /etc/varnish/default.vcl
改:
16backend default {
17 .host ="127.0.0.1";
18 .port ="8080";
19}
为:
16backend web1 {
17 .host ="172.17.120.51";
18 .port ="80";
19}
结尾追加:
35sub vcl_deliver {
36 # Happens when we have all the pieces we need, and are about to send the
37 # response to the client.
38 #
39 # You can do accounting or modifying the final object here.
40if(obj.hits > 0) {
41 setresp.http.X-Cache ="HIT from "+req.http.host;
42 setresp.http.X-Cache-Hits =obj.hits;
43 } else{
44 setresp.http.X-Cache ="MISS from "+req.http.host;
45 }
46 return (deliver);
47}
[root@docker-01 ~]# vim /etc/varnish/varnish.params
改:
14VARNISH_LISTEN_PORT=6081
为:
14VARNISH_LISTEN_PORT=80
[root@docker-01 ~]# systemctl restart varnish
注:截图展示
7.2配置docker-02为web服务
[root@docker-02 ~]# yum install httpd
[root@docker-02 ~]# echo "yunweimao" > /var/www/html/index.html
[root@docker-02 ~]# service httpd restart
7.3测试
测试源站点:
在浏览器中访问:http://172.17.120.51/
测试加速:
在浏览器中访问:http://172.17.120.50/
能够正常访问,说明代理设置成功。
7.4测试缓存命中
扩展:curl命令
curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态。
参数:
-I只取http响应头的信息,不取网页内容
[root@docker-02 ~]# curl -I 172.17.120.51 ##docker-01上查看docker-02开启动的web服务器类型
HTTP/1.1 200OK
Date: Tue, 15Oct 201908:19:36 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 15Oct 201907:22:43 GMT
ETag: "a-594edd9b0bc06"
Accept-Ranges: bytes
Content-Length: 10
Content-Type: text/html; charset=UTF-8
[root@docker-01 varnish]# curl -I 172.17.120.50
HTTP/1.1 200OK
Date: Tue, 15Oct 201908:21:08 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 15Oct 201907:22:43 GMT
ETag: "a-594edd9b0bc06"
Content-Length: 10
Content-Type: text/html; charset=UTF-8
X-Varnish: 32775
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS from 172.17.120.50 ##表示没有命中
Connection: keep-alive
[root@docker-01 varnish]# curl -I 172.17.120.50
HTTP/1.1 200OK
Date: Tue, 15Oct 201908:21:08 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 15Oct 201907:22:43 GMT
ETag: "a-594edd9b0bc06"
Content-Length: 10
Content-Type: text/html; charset=UTF-8
X-Varnish: 1332776
Age: 53
Via: 1.1 varnish-v4
X-Cache: HIT from 172.17.120.50 ##表示命中
X-Cache-Hits: 1
Connection: keep-alive
8、使用varnish加速多个不同域名站点的web服务器
配置docker-02和docker-03为web服务器
docker-02之前已经配置成web服务器
8.1配置docker-03为web2服务器
[root@docker-03 ~]# yum install httpd
[root@docker-03 ~]# echo 'maoxiaopu' > /var/www/html/index.html
[root@docker-03 ~]# systemctl start httpd
[root@docker-03 ~]# vim /etc/hosts
172.17.120.50 www.docker.cn
172.17.120.50 bbs.docker.cn
[root@docker-03 ~]# systemctl restart httpd
8.2配置docker-01 上的varnish服务器
[root@docker-01 varnish]# vim /etc/varnish/default.vcl
改:
16backend web1 {
17 .host ="172.17.120.51";
18 .port ="80";
19}
为:
16backend web1 {
17 .host ="172.17.120.51";
18 .port ="80";
19}
20backend web2 {
21 .host ="172.17.120.53";
22 .port ="80";
23}
##当访问www.docker.cn域名时从web1上取数据,访问bbs.docker.cn域名时到web2取数据
25sub vcl_recv {
26 # Happens before we check if we have this in cache already.
27 #
28 # Typically you clean up the request here, removing cookies you don't ne ed,
29if(req.http.host ~ "(?i)^(www.)?docker.cn$") {
30 set req.http.host = "www.docker.cn";
31 setreq.backend_hint =web1;
32 } elsif (req.http.host ~ "(?i)^bbs.docker.cn$") {
33 set req.backend_hint = web2;
34 return(hash);
35}
36}
注:截图展示
8.3重新加载varnish配置文件
[root@docker-01 varnish]# systemctl restart varnish.service
9、测试
[root@docker-01 varnish]# vim /etc/hosts
172.17.120.50 www.docker.cn
172.17.120.50 bbs.docker.cn
[root@docker-01 varnish]# yum install elinks -y
[root@docker-01 varnish]# elinks bbs.docker.cn --dump
maoxiaopu
[root@docker-01 varnish]# elinks www.docker.cn --dump
yunweimao
关于运维学习、分享、交流,笔者开通了微信公众号【运维猫】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学运维知识。
有需要技术交流的小伙伴可以加我微信,期待与大家共同成长,本人微信: