Varnish的简介
Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。这个项目是由挪威的一家报纸 Verdens Gang 的网络分支起始的,其架构设计和开发总监Poul-Henning Kamp 是FreeBSD 核心的开发人员之一,最初项目的管理与基础设施及额外开发由挪威一家Linux咨询公司 Linpro提供。
说到varnish,squid 就不得不提及。squid 算得上是古老的缓存服务器。由于varnish先进的设计理念,性能要比squid高上许多Verdens Gang使用3台Varnish代替了原来的12台Squid,性能比以前更好。,varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,这些squid都做不到。但是varnish在高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的缓存数据将全部丢失。
Vcl流程:
- Varnish Configuration Language (VCL)
是 varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认的定义。
VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成。
vcl详细流程:
图中椭圆形部分称为varnish的状态节点,又称为状态引擎,还有种叫法为varnish的内置函数。
图中红色的线条:没有查询缓存/缓存中数据过期/缓存中没有数据 情况下的流程
图中橙黄色的线条:直接将匹配数据通过内置函数vcl_pipe送往后台主机的流程
图中绿色的线条:查询缓存数据命中且数据没有过期/经后台主机返回的数据经被缓存后返回给客户流程
图中蓝色的线条:数据没有命中缓存向后台主机发出查询的流程
图中黑色的线条:数据从后台主机返回给varnish缓存的流程
Varnish服务的配置
Varnish服务器的部署 (server1虚拟机 ip 172.25.3.1)
1)Varish的安装
使用yum安装解决依赖性,如果yum安装无法在yum源里解析到安装包,只需要在yum源共享该目录
Varish的主配置文件
/etc/rc.d/init.d/varnish # 启动脚本
/etc/varnish/default.vcl # 默认的vcl规则配置
/etc/sysconfig/varnish # 向varnish传递的参数
传递参数 /etc/sysconfig/varnish
NFILES=131072 ## 打开的最大文件数,varnish 自动调整该值
MEMLOCK=82000 ## 内存中共享日志空间的大小
sysctl -a | grep file ## 可以看到系统所支持的最大打开文件数和共享日志空间
需要将配置文件数额修改的低于系统支持
或者再配置文件中修改系统支持的最大打开文件数和共享
vim /etc/security/limits.conf
内容如下:
在文件最后添加:
# End of file
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
编辑/etc/sysconfig/varnish 配置服务端口
编辑/etc/varnish/default.vcl 配置后端服务器
backend web1 { # 第一个后端服务器
.host = "172.25.3.2";
.port = "80";
}
backend web2 { # 第二个后端服务器
.host = "172.25.3.3";
.port = "80";
}
9
# 当访问 www.westos.org 域名时从 web1 上取数据
访问 www.kobe.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 {return(synth(405))
}
web服务器的部署
web1(server2虚拟机 ip 172.25.3.2)
httpd服务安装
yum install httpd -y
systemctl start httpd
默认发布目录下测试内容编写
vim /etc/www/html/index.html
我是server2
web2 (server3虚拟机ip 172.25.3.3)
安装httpd
yum install httpd -y
systemctl start httpd
默认发布目录下测试内容编写
vim /etc/www/html/index.html
我是server3
在server1上编写本地域名解析文件,写入server2的域名 www.westos.org和server3的域名bbs.westos.org
测试:
crul www.westos.org
crul org.westos.org
分别得到server2和server3的主机名称
健康检查和负载均衡
健康监测
varnish可以对后端主机进行健康检测,动态进行移除或恢复后端主机调度列表
#probe:定义健康状态检测方法
#url:检测时请求的URL,默认为”/”;
#request:发出的具体请求;
#request =
#“GET /.healthtest.html HTTP/1.1”
#“Host: www.magedu.com”
#“Connection: close”
#window:基于最近的多少次检查来判断其健康状态;
#threshhold:最近.window中定义的这么次检查中至有.threshhold定义的次数是成功的;
#interval:检测频度;
#timeout:超时时长;
#expected_response:期望的响应码,默认为200;
负载均衡
英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
varnish 的负载均衡可理解为,将一个服务器上的信息分摊到多个服务器上,防止一个服务器崩溃导致无法进行数据访问.
配置/etc/varnish/default.vcl
vim /etc/varnish/default.vcl
probe healthcheck {
.url = "/index.html"; # 哪个 url 需要 varnish 请求
.interval = 5s; # 检查的间隔时间
.timeout = 1s; # 等待多长时间探针超时
.window = 5; # 维持 5 个 sliding window 的结果
.threshold = 3; # 至少有三次 window 是成功的,就宣告bachend 健康
}
backend web1 {
.host = "172.25.3.2";
.port = "80";
.probe = healthcheck;
}
backend web2 {
.host = "172.25.3.3";
.port = "80";
.probe = healthcheck;
}
director skr round-robin { # 把多个后端聚合为一个组
{ .backend = web1; }
{ .backend = web2; }
}
客户端测试:
轮询效果
curl www.westos.org
varnish cdn 推送平台
- CDN的全称是Content Delivery Network,即内容分发网络。
基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
cdn 的简单测试
环境设置:httpd 服务 varnish服务 php服务 (server1 ip 172.25.3.2)
安装bansys软件包
unzip bansys.zip -d /var/www/html
把解压后的所有文件必须放在httpd默认发布目录下,如果不是直接解压在apache默认发布目录,复制与移动时注意selinux安全上下文
配置 /var/www/html/config.php
将文件内容删减一部分
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.3.2'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.test.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
修改httpd的配置文件
vim /etc/httpd/conf/httpd.conf
将默认的监听端口80 改成8080 (因为在上面的cdn配置中80端口已经被占用)
客户端测试