Varish
主机环境: rhel6 selinux and iptables disabled
实验主机:
192.168.0.250 varnish
192.168.0.188 apache
192.168.0.189 apache
VCL 处理流程图
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
cdn的基本介绍
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度
http加速器:varnish
Varnish 是一个 web 加速器,被安装在 web 应用程序前面,缓存 web 应用程序,并响应用户请求,varnish 让您的 web 应用程序运行的更快,并且 varnish 灵活好用。
1. 安装
Yum install -y varnish-3.0.3-1.el6.x86_64.rpm varnish-libs-3.0.3-1.el6.x86_64.rpm
2. 配置
vim /etc/varnish/default.vcl ###配置一个后端服务器
backend default {
.host = "172.25.27.2";
.port = "80";
}
vi /etc/sysconfig/varnish ###配置 varnish 服务端口
VARNISH_LISTEN_PORT=80
这里的端口改为80的原因是:在用户体验时,均是直接访问浏览器的http服务,不会在后面加:(端口号),所以在实际体验中。是要将varnish服务的端口号改为80端口的。
[root@server1 varnish]# /etc/init.d/varnish start
[root@server2 mnt]# /etc/init.d/httpd start
[root@server2 mnt]# vim /var/www/html/index.html
[root@server2 mnt]# cat /var/www/html/index.html
<hi> www.server2.com </hi>
物理主机测试:
在测试时,只需要将开启varnish的服务器写入本地解析文件即可
[root@foundation27 ~]# vim /etc/hosts
测试时,www.westos.org是从172.25.27.1的主机上传来的信息,这正是varnish服务开启的主机
在浏览器中,经常会有一个缓存,来存储连接相近的一些信息,当用户在短时间进行再次访问时,是直接进行查找内存中的信息的,这样会减少后台服务器的压力。
###查看缓存命中情况
vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) { # 一旦被投递了这个对象,如果其内部个数大于0,那么则命中
set resp.http.X-Cache = "HIT from westos cache"; #意思是再次访问时,是在内存中进行读取内容的
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
[root@server1 varnish]# /etc/init.d/varnish reload
###测试缓存命中
[root@foundation27 ~]# curl -I 172.25.27.1
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sun, 04 Mar 2018 07:04:59 GMT
ETag: "5fe70-1b-56690d3de6704"
Content-Type: text/html; charset=UTF-8
Content-Length: 27
Accept-Ranges: bytes
Date: Sun, 04 Mar 2018 08:11:11 GMT
X-Varnish: 80613317
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache #未命中
[root@foundation27 ~]# curl -I 172.25.27.1
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sun, 04 Mar 2018 07:04:59 GMT
ETag: "5fe70-1b-56690d3de6704"
Content-Type: text/html; charset=UTF-8
Content-Length: 27
Accept-Ranges: bytes
Date: Sun, 04 Mar 2018 08:11:16 GMT
X-Varnish: 80613318 80613317
Age: 6
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache #命中
### 通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$ #清除所有
# varnishadm ban.url /index.html #清除 index.html 页面缓存
# varnishadm ban.url /admin/$ #清除 admin 目录缓存\
###定义多个不同域名站点的后端服务器
backend web1 {
.host = "172.25.27.2";
.port = "80";
}
backend web2 {
.host = "172.25.27.3";
.port = "80";
}
#当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.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 {error 404 "westos cache";
}
}
# service varnish reload
###定义负载均衡
#定义健康检查
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.27.2";
.port = "80";
.probe = healthcheck;
}
backend web2 {
.host = "172.25.27.3";
.port = "80";
.probe = healthcheck;
}
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 ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
# service varnish reload
测试:实现了轮调,减轻了后台服务器的压力
varnish cdn 推送平台
存在的意义,在一些活动中,活动方为了尽快使客户端能受到最新的消息,而此时却又浏览器的缓存设置,就产生了推送平台这个东西,客户端在访问时,都 是访问的是调度器,所以为了将最新的消息发送,使用了缓存推送,###在此次测试时,必须将上面设置的return(pass)策略删除,
bansys.zip为所使用的推送包
此次实验使用的推送平台是使用php语言写的,需要下载php包
缓存推动平台是在网页中打开的,所以也需要httpd服务,但是varnish已经将80端口占了,所作的都是为了varnish进行服务,所以经apahce的端口进行修改
unzip bansys.zip -d /var/www/html
vi /var/www/html/bansys/config.php #只保留如下设置,其余注释掉
<?php
$var_group1 = array(
'host' => array('172.25.27.1'), #使用varnish的主机
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
vi /etc/varnish/default.vcl
acl westos { #设置访问控制
"127.0.0.1";
"192.168.0.0"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
service varnish reload
手动清除缓存后,在还没有达到TTL值时,已经进行了更新