一、Varnish简介
Varnish 是一款高性能且开源的反向代理服务器和 HTTP加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进varnish 迅速发展起来。
二、Varnish工作原理图
vcl_recv:是在Varnish完成对请求报文的解码为基本数据结构后第一个要执行的子例程
vcl_fetch:根据服务器端的响应作出缓存决策
vcl_pipe:用于将请求直接发往后端主机
vcl_hash:自定义hash生成时的数据来源
vcl_pass:用于将请求直接传递至后端主机
vcl_hit:从缓存中查找到缓存对象时要执行的操作
vcl_miss:从缓存中款查找到缓存对象时要执行的操作
vcl_deliver:将用户请求的内容响应给客户端时用到的方法
vcl_error:在varnish端合成错误响应而时
三、配置Varnish服务器
server2上
1.下载安装Varnish软件包
现在你的虚拟机可能连不上网,你可以在真机下载,然后scp过去,但是会出现下面问题
现在就需要在虚拟机一个openssl-clients这个软件,然后就可以了
2.修改varnish的监听端口
vim /etc/sysconfig/varnish
3.修改配置文件
打开文件的最大数,有如下关系:内核操作> 操作系统> 软件
内核允许的打开文件最大数
但是varnisg软件的打开文件最大数
因为默认数量大于内核操作的文件数,所以要将默认数量改小一点
[root@server2 varnish]# vim /etc/sysconfig/varnish
NFILES=65535
还要修改内存空间和线程数,文件数应该介于上述两者之间
[root@server2 varnish]# vim /etc/sysconfig/varnish
MEMLOCK=82000
NPROCS="unlimited"
可修改:
server3网络服务器
安装httpd服务,并开启服务
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
在server3上vim /var/www/html/index.html
在sserver2上,修改varnish监听网络服务器的ip
vim /etc/vanish/default.val
刷新varnish
检测:在浏览器中输入172.25.66.3/index.html
手动清除缓存
### 通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 页面缓存
# varnishadm ban.url /admin/$
#清除 admin 目录缓存
四、查看缓存命中情况
1、server2: 在varnish配置文件(/etc/varnish/default.vcl)中添加如下代码:
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.1.2"; # 后端服务器的ip
.port = "80"; # 后端服务器的端口
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache"; #在varnish中命中HIT访问的域名
}
else {
set resp.http.X-Cache = "MISS from westos cache"; #后端服务器中得到MISS访问的域名
}
return (deliver);
}
2、重新加载默认文件
/etc/init.d/varnish reload
3、在物理机中添加www.westos.org的解析
172.25.66.2 www.westos.org
4、在物理机中测试: curl -I www.westos.org
五、定义多个不同域名站点的后端服务器
此实验需要一台varnish主机(server2),还有两台虚拟机(server3,server4)
1、在server4的httpd服务的默认发布目录下编辑文件(/var/www/html/index.html)
bbs.westos.com
2、将bbs解析到物理主机中
172.25.66.2 bbs.westos.org
3、配置varnish的配置文件(vim /etc/varnish/default.vcl)
backend web1 { # 后端第一个服务器名web1
.host = "172.25.1.2";
#将server2 www.westos.org作为第一个服务器主机
.port = "80";
}
backend web2 { # 后端第二个服务器名web2
.host = "172.25.1.3"
#将server3 bbs.westos.org作为第二个服务器主机
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
# 解析域名是westos.com 或www.westos.com,均访问172.25.1.2->server2
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
# 解析域名为bbs.westos.com,访问172.25.1.3->server 3
set req.backend = web2;
} else {error 404 "westos cache";
# 如果访问的域名不是这三者,404的错误
}
}
4、重新加载varnish
5、在物理机中测试
六、基于多台服务器的负载均衡
1、什么是负载均衡
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。
负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据具体的使用场景选取对应的算法。在varnish中我们采用的是轮询法,平衡对待么一个后端服务器。
2、在server2上配置varnish
backend web1 {
.host = "172.25.66.3";
.port = "80";
}
backend web2 {
.host = "172.25.66.4";
.port = "80";
}
director lb round-robin { #采用round-robn算法:一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法
{.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";
}
}
2、在serveer3的httpd服务的默认发布目录中写入www.westos.org-server3
在server4的httpd服务的默认分布目录中写入www.westos.org-server4
3、后台服务器的配置(server4)
vim /etc/httpd/conf/httpd.conf
#打开80端口
NameVirtualHost *:80
#在默认文件最后添加
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName bbs.westos.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
/etc/init.d/httpd restart
mkdir /www
vim /www/index/html
添加本地解析(vim /etc/hosts)
4、server3这台后台服务器的配置
5、在主机中测试
curl www.westos.org #交替出现server2和server3中默认发布内容,将其中一个用户关闭,则另一个用户继续抓取信息的工作,实现负载均衡,使其关闭的方法是关闭http服务,清除缓存即可
在网页上测试:
刷新网页
如果第一次出现server2(server3),那么120秒内都是server2(萨尔ver),因为server2(server3)将数据进行了缓存;
如果访问时间大于120s,它会出现server3(server2)(因为负载均衡采用的算法是平衡轮叫,server2和server3是公平地被访问的)
如果在默认函数中写上return(pass),那么它每次都直接从后端服务器中直接取,一次server2一次server3
如果server2或者server3其中一个损坏(关闭htpd服务),那么客户端只会访问健康的那一个,不会访问坏的哪一个,即负载均衡的健康检查。
当server4的后台网络服务器挂掉之后,就自动server3这台服务器
七、搭建CDN推送平台
1、CDN 的概念
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要是内容存储和分发技术
2、CDN推送的步骤
1.在server1安装httpd服务并编辑httpd配置文件,将136行的端口号修改8080(因为我们的varnish服务已经占用了80端口,避免冲突)
2.安装php(显示页面)
3.将banzip从物理机发送到server1,并在server1解压到/var/www/html(指定目录解压 -d)
5.将/var/www/html中的所有东西移到/var/www/html中
6.编辑config.php
1)将httpd服务的端口号改成8080,以防和varnish冲突
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
2)下载bansys安装包:http://code.google.com/p/varnish-php-bansys/
安装解压软件:yum install unzip -y
开始解压:unzip bansys.zip
将解压后的文件放到apache的默认发布目录中(/var/www/html/)
3)修改配置文件
[root@server2 html]# vim config.php
<?php
$var_group1 = array(
'host' => array('172.25.66.2'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
4)开启httpd服务
[root@server2 html]# /etc/init.d/httpd start
5)浏览器访问
6)编写varnish的默认文件vim /etc/varnish/default.vcl
acl westos {
#设置访问控制,即就是白名单,允许本机和172.25.66网段和推送
"127.0.0.1"; #本机的IP
"172.25.66.0"/24; #24是子网掩码
}
backend web1 {
.host = "172.25.66.3";
.port = "80";
}
backend web2 {
.host = "172.25.66.4";
.port = "80";
}
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.request == "BAN") { #如果采用的推送方式是BAN
if (!client.ip ~ westos) { #如果客户端的IP不是westos
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
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";
}
}
重新加载varnish:/etc/init.d/varnish reload
重启httpd服务:/etc/init.d/httpd restaart
测试:在浏览器中访问172.25.66.2:8080,在推送内容中输入想要更新的页面,选择HTTP