之前我们介绍过squid服务器,这里我们再讲一个更高性能的服务器:varnish
简介
Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。
Varnish 的创造者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
VCL 处理流程图
处理过程大致分为如下几个步骤:
- Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
- Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
- Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
- Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
- Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
Varnish与Squid的对比
相同点:
- 都是一个反向代理服务器
都是开源软件
Varnish的优点:
- Varnish的稳定性很高。
- Varnish访问速度更快,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。
- Varnish可以支持更多的并发连接。
- Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
- squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。
Varnish的缺点:
varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
varnish 服务配置
一、基础环境配置
1,封装虚拟机,配置三台
两台作为后端服务器 server2 : 172.25.77.2 , server3 : 172.25.77.3
一台作为varnish缓存服务器 server1 : 172.25.77.1
主机为客户端clients : 172.25.77.250
注 : 操作系统为 rhel6.5
2,配置varnish服务器(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).配置
配置一个后端服务器 配置文件 : /etc/varnish/default.vcl
//文件中本身除了此处全部是注释掉的
在文件中 添加设置使可以查看缓存命中情况:
# 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);
配置 varnish 服务端口 配置文件 : /etc/sysconfig/varnish
...
7 # Maximum number of open files (for ulimit -n)
8 NFILES=65535
注 :
1)NFILES = xxx 要修该的话,需要查看操作系统和内核限制,其中内核限制 > 操作系统限制 ,每个限制都相关,所以都需要修改
2)生产环境中,如果出现系统显示处理文件处理不过来的现象,多半就是这个问题
9
10 # Locked shared memory (for ulimit -l)
11 # Default log size is 82MB + header
12 MEMLOCK=64000
13
14 # Maximum number of threads (for ulimit -u)
15 NPROCS="unlimited" ##无限制线程程实际上是1024,这是默认的上限
主要的更改 :
66 VARNISH_LISTEN_PORT=80 ##将监听端口修改为80,这是apache的默认端口
95 VARNISH_TTL=120 ##TTL 值是缓存时间,也相当于为服务器提供保护
3) .开启varnish
两种开启的方法:
/etc/init.d/varnish start "开启" | reload "重新读取"
service varnish start / reload
3 ,配置后端的httpd服务
server2 (172.25.77.2)
编辑apache主页面 /var/www/html/index.html
<title>server2</title>
<h1> www.westos.org </h1>
重启apache服务 : /etc/init.d/httpd restart
server3 (172.25.77.3)
编辑apache主页面 /var/www/html/index.html
<title> server3 </title>
<h1> www.westos.org </h1>
另外发布一个页面 /bbs/index.html
<title> sever3 </h1>
<h1> bbs.westos.org </h1>
因为发布两个页面,所以需要开启虚拟主机 在rhel6.5版本中,虚拟主机的配置都综合在主配置文件
/etc/httpd/conf/httpd.conf
...
990 NameVirtualHost *:80 ##开启虚拟主机,使用的端口为80
1010 <VirtualHost *:80> ##编辑第一个主页面 www.westos.org
1011 DocumentRoot /var/www/html
1012 ServerName www.westos.org
1013 </VirtualHost>
1014 <VirtualHost *:80> ##编辑第二个页面 bbs.westos.org
1015 DocumentRoot /bbs
1016 ServerName bbs.westos.org
1017 </VirtualHost>
重启apache服务生效: /etc/init.d/httpd restart
4,测试
在客户端测试,编辑本地的解析文件 /etc/hosts
命中测试:
//其中的Age 为TTL值,,第一次因为没有缓存所以未命中,第二次就成功命中了,同时也在读取TTL值
二、varnish更多功能
通过 varnishadm 手动清除缓存
varnishadm ban.url .*$ //清除所有'
varnishadm ban.url /index.html //清除 index.html 页面缓存
varnishadm ban.url /admin/$ //清除 admin 目录缓存
1、定义多个不同域名站点的后端服务器
backend server2 {
.host = "172.25.77.2";
.port = "80";
}
backend server3 {
.host = "172.25.77.3";
.port = "80";
}
2、当访问 www.westos.org 域名时从 server2 上取数据,访问 bbs.westos.org 域名时到 web3 取数据,访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = server2;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = server3;
} else { error 404 "westos cache"; }
}
这个设置之后,在curl命中直接加ip就显示不了了
# service varnish reload 重新读取配置生效
//搜索ip无法显示
//active 中为0显示为正确
3、定义负载均衡
- 定义健康检查:
probe healthcheck {
.url = "/index.html"; # 哪个 url 需要 varnish 请求
.interval = 5s; #检查的间隔时间
.timeout = 1s; #等待多长时间探针超时
.window = 5; #维持 5 个 sliding window 的结果
.threshold = 3; #至少有三次 window 是成功的,就宣告 bachend 健康
}
- 把多个后端聚合为一个组,并检测后端健康状况:
director westos round-robin { //round-robin : 轮询机制'
{ .backend = server2; }
{ .backend = server3; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = westos; //实现lb套件
return (pass); //为了测试方便,不进行缓存。
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = server3;
} else {
error 404 "westos cache";
}
}
# service varnish reload
注 :
这里 return(pass) 和在注配置文件中设置 TTL = 0 效果效果相同,但是意义却不一样。
TTL设置的是dns缓存,如果设置为 0 , 那么这个varnish缓存服务器的存在也没有必要了,将 return(pass) 添加的意义是临时为了实验效果,真实环境不会使用。
真实环境会将TTL 设置为长时间,然后需要时再单独清空缓存。
三、varnish cdn 推送平台
1、开启apache服务,设置httpd服务监听端口为8080
//因为vanish占用的是80端口,所以需要重新改变端口,不然服务也起不来
2、需要安装 php 支持
yum install unzip -y
unzip bansys.zip -d /var/www/html/#解压到指定目录
yum install php -y
3、配置服务
vim /var/www/html/bansys/config.php ##只保留如下设置,其余注释掉
4、bansys 有两种工作模式,分别是:telnet 和 http 模式
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $ {VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
如果是 http 模式需要对 varnish 做以下设置:
# vi /etc/varnish/default.vcl
#设置acl访问控制
acl list { ##注意list名称不要和之前定义的名称重叠,不然会出错
"172.25.77.1";
"172.25.77.0"/24;
}
sub vcl_recv { ##这个函数值之前定义过,加在里面就好
if (req.request == "BAN") {
if (!client.ip ~ list) { error 405 "Not allowed."; }
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
# service varnish reload 重新读取varnish配置生效
5、测试
原始访问的界面是server3:
网页访问 网址 : 172.25.77.1:8080
//实现点对点的刷新指定界面
//点击确认提交成功
刷新界面:
//因为设置了轮询机制,所以是刷新成功了
tips:
- 在真实生产环境中,可能设置的缓存时间为一个月甚至更久,这里就需要推送平台了,因为如果用varnish刷新的命令,需要管理员的权限,这显然是非常不安全的,用平台就可以避免这个问题,另外还可以对指定的界面进行刷新,非常的实用