一、varnish简介 Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。现在的varnish已经很健壮。很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。 Varnish工作原理图 当varnish上没有缓存时,加速过程是: client ---> dns ---> cdn ---> server ---> cdn ---> cache --->client 当varnish上有缓存时,加速过程是: client ---> dns ---> cdn ---> cache ---> client 二、VCL简介 Varnish Configuration Language(VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。 VCL 处理流程图 处理过程大致分为如下几个步骤: (1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或 Pipe,或者进入 Lookup(本地查询)。 (2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进 入 miss 状态。 (3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。 (4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地 的存储。 (5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。 三、varnish的安装 实验主机:172.25.88.1(server1) varnish 172.25.88.2(server2) apache 172.25.88.3(server3) apache 在server1中: 1、安装varnish yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y 2、更改varnish服务端口为80 vim /etc/sysconfig/varnish 3、更改varnish配置文件 vim /etc/varnish/default.vcl backend default { #配置一个后端服务器 .host = "172.25.88.2"; #更改访问ip为172.25.88.2 .port = "80"; 4、重新加载服务 在server2中 1、安装apache yum install httpd -y 2、开启服务 /etc/init.d/httpd start 3、编写vim /var/www/html/index.html测试页 4、重新加载服务 5、测试: 在物理机中打开firefox,访问172.25.88.1,看到server2即配置成功。 四、测试缓存命中情况 1、在server1中: 1)更改varnish的配置文件 添加: # 查看缓存命中情况 编辑vim /etc/varnish/default.vcl 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); } 2)重新加载服务 2、测试: curl -I 172.25.88.1 第一次显示MISS from westos cache缓存中没有,前往后端获取 第二次显示HIT from westos cache缓存中直接获取 3、通过varnish手动清除缓存 varnishadm ban.url .*$ #清除所有缓存 varnishadm ban.url /index.html #清除 index.html 页面缓存 varnishadm ban.url /admin/$ #清除 admin 目录缓存 这三条命令可根据自己的需求来选择适合的命令来清除varnish服务器的缓存。 使用curl -I 172.25.88.1访问和使用curl -I 172.25.88.1/index.html访问,得到的结果一样,但是这两条命令会在缓存区生成两条不同的缓存。 1)server1中执行varnishadm ban.url .*$来清除所有缓存 物理机中curl -I 172.25.88.1 ,发现显示MISS from westos cache 物理机中curl -I 172.25.88.1/index.html两次,使172.25.88.1/index.html缓存到cache中 2)server1中执行varnishadm ban.url/index.html来清除index.html页面缓存 物理机中curl -I 172.25.88.1/index.html 发现显示MISS from westos cache 注意: 使用curl -I 172.25.88.1访问和使用curl -I 172.25.88.1/index.html访问得到的结果一样,但是这两条命令会在缓存区生成两条不同的缓存。 curl -I 172.25.4.1访问的结果中Age表示缓存时间,默认为120s后自动清除,可在/etc/sysconfig/varnish中修改 五、定义多个不同域名点的后端服务器 1、在server1中: 1)更改varnish配置文件 vim /etc/varnish/default.vcl backend web1 { .host = "172.25.88.2"; .port = "80"; } backend web2 { .host = "172.25.88.3"; .port = "80"; } #当访问 www.westos.org 域名时从 web1 上取数据,访问www.linux.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 ~ "^www.linux.org") { set req.backend = web2; } else {error 404 "westos cache"; } } 2)重新加载服务 /etc/init.d/varnish reload 2、在server2中: 1)编写测试页 vim /var/www/html/index.html 2)重新加载服务 /etc/init.d/httpd reload 3、在server3中: 1)安装apache,并开启服务 2)编写测试页 vim /var/www/html/index.html 3)重新加载服务 /etc/init.d/httpd reload 4、在物理机中: 1)添加本地解析: vim /etc/hosts 5、测试: 在物理机中打开firefox测试得到相应的文件内容 测试www.westos.org和westos.org发现两者的结果一样,都是server2中index.html文件中的内容 测试www.linux.org得到的是server3中默认发布文件中的内容 六、定义负载均衡和健康检查 1、在server3中: 1)更改apache配置文件 vim /etc/httpd/conf/httpd.conf 打开:NameVirtualHost *:80 添加: <VirtualHost *:80> DocumentRoot /var/www/html ServerName www.westos.org </VirtualHost> <VirtualHost *:80> DocumentRoot /www ServerName www.linux.org </VirtualHost> 2)建立/www/index.html mkdir /www vim /www/index.html 3)重新加载服务 4)配置本地解析 vim /etc/hosts 5)测试配置是否生效 curl www.westos.org curl www.linux.org得到相应发布文件中的内容 2、在server1中: 1)更改varnish配置 vim /etc/varnish/default.vcl director lb 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 = lb; return (pass); } elsif (req.http.host ~ "^www.linux.org") { set req.backend = web2; } else {error 404 "westos cache"; } } 2)重新加载服务 3)测试: 在物理机中执行curl www.westos.org得到server2中的index.html中的文件内容 在server1中: varnishadm ban.url .*$ #清除所有缓存 在物理机中curl www.westos.org得到server3中的index.html中的文件内容 4)在server1中: 更改varnish配置文件 vim /etc/varnish/default.vcl 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 ~ "^www.linux.org") { set req.backend = web2; } else {error 404 "westos cache"; } } 重新加载服务 5)测试: 在物理机中执行curl www.westos.org循环得到server2和server3中index.html文件中的内容 当server2的httpd服务关闭curl www.westos.org会一直读取server3相应的index.html内容而不报错,这是因为varnish拥有自动的健康检查功能, 若开启server2的httpd服务,在物理机中执行curl又能够循环得到server2和server3相应的index.html内容 七、varnish全局配置文件中的参数 1、sysctl -a | grep file #查看内核允许的打开文件数的最大值 2、更改varnish配置文件 vim /etc/sysconfig/varnish #因为内核大于软件,所以修改NFILES 3、更改系统限制文件 vim /etc/security/limits.conf 添加:varnish nofile 66656 4、MEMLOCK #用多大内存空间保存日志信息 1)更改varnish用户为可交互登陆模式 usermod -s /bin/bash varnish 2)切换到varnish用户,查看系统允许的最大值ulimit -l ulimit -a #查看所有系统限制 3)更改系统限制文件 vim /etc/security/limits.conf varnish memlock 82000 5、NPROCS #进程核心转储所使用的内存空间,unlimited表示无上限 切换到varnish用户 ulimit -u #查看系统允许的最大值 更改系统限制文件 vim /etc/security/limits.conf varnish nproc unlimited 6、还原varnish用户登陆设置 usermod -s /sbin/nologin varnish 7、查看/etc/sysconfig/varnish 里的配置文件 VARNISH_TTL=120 #联系后端服务器的超时时间 VARNISH_STORAGE_SIZE=1G #储存的文件的大小 VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #基于文件存储时的文件路径