环境配置母盘的封装
我们的实验使用rhel-server-6.5-x86_64-dvd.iso的镜像,然后用这个镜像安装一个虚拟机作为母盘,安装完成后进行以下配置:
(1)更改主机名:
vi /etc/sysconfig/network #6.5文本编辑器为vi
(2)配置ip:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
删除/etc/uaev/rules.d/70XXXXXX(否则新建的虚拟机快照网络起不来)
配置好后重启网络服务:
(3)添加地址解析
vi /etc/hosts
(4)关闭火墙
/etc/init.d/iptables stop
/etc/init.d/ip6tables stop
chkconfig iptables off
chkconfig ip6tables off
(5)设置selinux为disabled
vi /etc/sysconfig/seliniux
(6)配置yum源
vi /etc/yum.repo.d/rhel-source.repo
(7)安装基本软件
yum install -y vim lftp openssh-clients -y
配置好后poweroff,母盘就不要打开啦!之后再需要虚拟机快照就可以了。
最后在真机中清除虚拟机base的缓存
yum whatprovides */virt-sysprep
yum install 1:libguestfs-tools-c-1.32.7-3.el7.x86_64 -y ##安装命令
virt-sysprep -d base ##清除虚拟机base的缓存
本次实验我们需要三个虚拟机来模拟企业环境,直接对母盘快照,安装三个虚拟机
cd /var/lib/libvirt/images/
qemu-img create -f qcow2 -b base.qcow2 vm1
qemu-img create -f qcow2 -b base.qcow2 vm2
qemu-img create -f qcow2 -b base.qcow2 vm3
安装完成后三个虚拟机一模一样,我们需要更改vm2和vm3的主机名及ip
下面我们进入正题,先来了解一下Varnish:
(1)varnish是什么
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。
(2)varnish的特点
-
varnish可以通过端口进行管理,使用正则语句做到清除缓存的功能,这些squid都做不到,但是在varnish高并发的情况下,资源消耗较高,而且varnish服务进程一旦崩溃,重启,内存中的数据将会全部丢失。
-
varnish与一般服务机器软件类似,就是一个web缓存代理服务器。例如接受http请求,为缓存对象分配存储空间,清除过期缓存对象,释放空间 碎片整理。
-
http请求处理过程:
有一个专门负责接收http请求的线程,一直监听请求端口,当有请求过来时,负责唤起一个工作线程来处理请求
工作线程会分析http请求的url,知道了这个请求想要什么,就到缓存中查找是否有这个对象
如果有,就把缓存对象直接返回给用户
如果没有,会把请求转给后端服务器处理,并等待结果,工作线程从后端得到结果内容后,先把内容作为一个缓存对象保存到缓存空间(以备下次请求这个对象时快速响应),然后再把内容返回给用户 -
分配缓存过程:
有一个对象需要缓存时,根据这个对象的大小,到空闲缓存区中查找大小最适合的空闲块,找到后就把这个对象放进去,如果这个对象没有填满这个空闲块,就把剩余的空间做为一个新的空闲块,如果空闲缓存区中没地方了,就要先删除一部分缓存来腾出地方,删除是根据最近最少使用原则 -
释放缓存过程
有一个线程来负责缓存的释放工作,他定期检查缓存中所有对象的生存周期,如果某个对象在指定的时间段内没有被访问,就把这个对象删除,释放其占用的缓存空间,释放空间后,检查一下临近的内存空间是否是空闲的,如果是,就整合为一个更大的空闲块,实现空间碎片的整理 -
varnish的进程:master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多worker线程。
(3)vcl简介
Varnish Configuration Language(VCL)是varnish配置缓存策略的工具,它是一种基于‘域’的简单变成语言,使用VCL编写的缓存策略通常保存在.vcl文件中,其需要编以成二进制的格式后才能由varnish调用
VCL处理流程图
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
一.varnish反向代理搭建
本次实验我们以server1主机为varnish代理服务器,server2为服务端,物理机为客户端
在server1主机
- 准备varnish的安装包并安装,也可以在官网下载
安装完成后在系统的/etc/passwd中生成varnish用户,对varnish的访问控制实际上是对varnish用户的控制实现的
-
配置varnish
rpm -qc varnish-3.0.5-1.el6.x86_64 #查看varnish服务的配置文件
vi /etc/sysconfig/varnish 配置文件
8 NFILES=131072 ##最多能打开的文件数,varnish会自动调整该数值
12 MEMLOCK=82000 #最多能使用的内存空间,varnish会自动调整该数值
15 NPROCS="unlimited" #单个用户所能运行的最大线程数,varnish会自动调整该数值
66 VARNISH_LISTEN=80#修改varnish的监听端口为80
netstat -tnlp #查看端口是否打开
我们看到varnish最多能打开的文件数为131072,接下来我们查看一下系统内核最多能打开的文件数
sysctl -a | grep file #查看系统文件数
可以看出系统内核最多能打开文件数为47360,明显小于131072,因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为47360,varnish用户的最大文件限制为131072,在模拟中需要满足varnish用户的文件的最大值,我们可以通过减少varnish最大文件数或者增大系统最大文件数来满足,这里我们选择增大系统最大文件数。
varnish需要的资源,系统满足不到,因此需要让他受到限制,即给他营造假象
vim /etc/security/limits.conf 配置varnish用户的安全限制,造成varnish已经获得到了需要软件自身的资源,相当于在系统里告诉varnish虽然达不到要求,但尽力满足
在该文件最后写入:
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
vim /etc/varnish/default.vcl 给varnish添加一个后端服务器
在文件中添加的内容如下:
backend default {
.host = "172.25.254.2"; ##后端服务器的IP
.port = "80"; ##后端服务器的端口
/etc/init.d/varnish restart 重启服务
最后我们查看一下varnish开启的进程
varnish开启的时候会开启两个进程:一个root,一个自身
在server2后端服务器
- 安装apache并开启服务
- 编写默认发布文件,以便检测
在物理机上检测
curl 172.25.69.1 实际上1主机并不接受请求,而是通过反向代理将请求扔给2主机,所以访问到的是server2主机
二.Varnish缓存加速
在server1代理服务器上
-
在配置文件编辑是否命中反馈信息
12 sub vcl_deliver { 13 if (obj.hits>0){ #如果命中显示 14 set resp.http.X-Cache = "HIT from cache"; 15 } 16 else { 17 set resp.http.X-Cache = "MISS from cache"; 18 } 19 return (deliver); 20 }
/etc/init.d/varnish restart 重启服务
在物理机上检测
第一次显示未命中缓存
第二次显示命中缓存
第一次miss,在服务器上取的
第二次及以上hit, 在缓存里取的
Age:存在缓存里的时间,默认最多120秒
-
清除缓存
varnishadm ban.url .*$ ##清除所有缓存 varnishadm ban.url /index.html ##清除页面缓存(客户端curl -I ip/index,html 的内容会被清除) varnishadm ban.url /admin/$ #清除 admin 目录缓存
在server1代理服务器上清除所有缓存
再次在物理机查看
三.定义多个不同域名站点的后端服务器
在企业中我们不可能只有一个后端服务器,成百上千服务器会构成一个群组,此时就需要在varnish代理服务器上定义多个不同域名站点的后端服务器,客户端通过域名会访问不同的后端主机
实验前,为模拟不同的后端服务器,我们再打开一台虚拟机server3,安装http并编写默认发布主页以便检测效果
在server1代理服务器上
vim /etc/varnish/default.vcl 编写配置文件
7 backend web1 { #后端第一个服务器名web1
8 .host = "172.25.69.2"; #将server2 www.hello.org作为第一个服务器主机
9 .port = "80";
10 }
11
12 backend web2 { #后端第二个服务器名web2
13 .host = "172.25.69.3"; #将server3 bbs.hello.org作为第二个服务器主机
14 .port = "80";
15 }
16 #当访问 www.hello.org 或 hello.org 域名时从 web1 上取数据;
#访问 bbs.hellos.org 域名时到 web2 取数据;
#访问其他,页面报错。
17 sub vcl_recv {
18 if(req.http.host ~"^(www.)?hello.org") { #以www.hello.org开头,但可以忽略www
19 set req.http.host = "www.hello.org"; #统一规定它为www.hello.org
20 set req.backend = web1;
21 }elsif (req.http.host ~"^bbs.hello.org"){
22 set req.backend = web2;
23 }else {
24 error 404 "cache";
25 }
26 }
service varnish reload 刷新服务
在物理机上测试
-
进行地址解析
vim /etc/hosts
-
测试
curl www.hello.com curl bbs.hello.com
四.varnish的负载均衡
这里我们同时可以利用http的虚拟主机发布来更明显的看出效果
目的: 让客户端访问www.hello.org的时候,客户端主机server2和server3轮循;访问bbs.hello.org时,只在server3
在seerver1代理服务器
vim /etc/varnish/default.vcl 编写配置文件
backend web1 {
.host = "172.25.69.2";
.port = "80";
}
backend web2 {
.host = "172.25.69.3";
.port = "80";
}
director lb round-robin{ #设定负载均衡(指定算法:轮循)
{ .backend = web1;}
{ .backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?hello.org") {
set req.http.host = "www.hello.org";
set req.backend = lb; #指定轮循算法的定义名
return (pass); #关闭varnish缓存功能,这样不用每次清除缓存,实验效果更明显
} elsif (req.http.host ~ "^bbs.hello.org") {
set req.backend = web2;
} else {error 404 " cache";
}
}
service varnish reload
在server3上发布虚拟主机
-
编写虚拟主机配置文件
vim /etc/httpd/conf/httpd.conf 990 NameVirtualHost *:80 1011 <VirtualHost *:80> 1012 DocumentRoot /www 1013 ServerName www.hello.org 1014 </VirtualHost> 1015 <VirtualHost *:80> 1016 DocumentRoot /bbs 1017 ServerName bbs.hello.org 1018 </VirtualHost>
- 编写虚拟主机发布文件
在客户端测试
先清除一下代理服务器的缓存,否则看到的是之前的缓存
五.CDN推送平台的搭建
在企业中,我们使用CDN时如果每次都从代理服务器中去更改就太麻烦了,所以我们可以做一个页面平台,直接从页面中输入命令进行管理,就非常方便了。
在server1代理服务器
-
安装平台资源并解压
我们需要安装http、bansys.zip、php
unzip bansys.zip -d /var/www/html/ 将压缩包解压到http默认发布目录下 mv /var/www/html/bansys/* /var/www/html/ 将解压的文件移动到apache默认发布目录下
-
编写所获资源的php文件
vim /var/www/html/config.php <?php //varnish主机列表 //可定义多个主机列表 $var_group1 = array( 'host' => array('172.25.69.1'), 'port' => '8080', ); //varnish群组定义 //对主机列表进行绑定 $VAR_CLUSTER = array( 'www.hello.org' => $var_group1, ); //varnish版本 //2.x和3.x推送命令不一样 $VAR_VERSION = "3"; ?> 除了这几行,剩余的都删掉
-
将http的端口改为8080 (因为varnish用的80端口)
vim /etc/httpd/conf/httpd.conf Listen 8080
-
重启http
/etc/init.d/httpd start /etc/init.d/httpd restart
- 修改varnish配置文件
bansys 有两种工作模式,分别是:telnet 和 http 模式。
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
acl hello {
"127.0.0.1"; #设置访问控制
"172.25.60.0"/24;
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ hello) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
记得将return (pass)注释掉
/etc/init.d/varnish restart
在物理机上测试
打开firefox:http://172.25.69.1:8080/
我们输入一个清理缓存的命令看看效果
之后再次查看缓存命中情况,发现缓存被清除