1.CDN
一、什么是 CDN
CDN:缓存网络,Content Delivery Network,即内容分发网络;加速器,反向代理缓存。
基本原理:广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在
用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存
服务器直接响应用户请求内容管理和全局的网络流量管理(Traffic Management)是 CDN 的核心
所在。通过用户就近性和服务器负载的判断, CDN 确保内容以一种极为高效的方式为用户的请求提
供服务.总的来说,内容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距
用户仅有"一跳"(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于 CDN 服务
提供商的数据中心)的一个透明镜像。这样的架构使得 CDN 服务提供商能够代表他们客户,即内容
供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。
二 什么是Varnish
varnish 是一款具有高性能的开源 HTTP 加速器,具有方向代理、缓存的功能。
三 什么是VCL
####VCL 的处理流程
vcl compiler:配置接口vcl compiler 通过调用外部的 C cpmpiler( C 编译器)进行编译,这
就要依赖 gcc 编译器,然后生成一个二进制格式的配置对象,这个二进制格式的配置对象可以被各
Child 和 cache 子进程所加载读取相关配置。所以,每一次修改 varnish 配置文件,都要手动加
载、编译、装载、使用;支持动态装载vcl 的处理流程,主要是由 Varnish 的状态机决定,可以通
过 vcl 配置文件来对 varnish 状态机各个步骤所做的操作进行配置
vcl_recv:
vcl_recv 是 http 请求到达后进入的第一个状态,在这个状态中,可以对请求进行以下处理
1. 修改 client 请求,以减少缓存决策时的差异性。
2. 根据 client 请求,决定缓存策略。
3. 重定向请求
4. 决定处理请求的 backend(即后端webserver )
vcl_deliver:
在缓存数据将要发送到客户端时调用
2.VARNISH
查看文件/usr/lib/systemd/system/varnish.service
可以看到VARNISH配置要求。
配置VARNISH服务要求,其要求打开文件数为131072,存储位置最大为81000KB。但是默认为打开文件为1024,所以扩展虚拟服务机容量为20G(初始为10G)。
可以使用命令:ulimit -a ##查看所有服务默认打开文件最大数,以及默认存储容量
命令:ulimit -n 131072 ##将所有服务所开启的最大文件数该为131072
命令:ulimit -m 82000 ##将所有的最大容量改为82MB
在文件将VARNISH服务配置永久更改:vim /etc/security/limits.conf
varnish - nofile 131072
varnish - memlock 82000
- Varnish代理:客户访问外层主机,其调度服务机2为客户服务。
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.16.2"; ##指定服务机2IP地址
.port = "80"; ##指定端口号
}
vim /etc/varnish/varnish.params
VARNISH_LISTEN_PORT=80 ##修改VARNISH服务端口号80
服务机2上写index.html界面:
通过客户机访问:
2.查看缓存命中情况
代理机上(安装了VARNISH):
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.16.2";
.port = "80";
}
sub vcl_deliver {
if (obj.hits>0){
set resp.http.X-Cache = "HIT from westos cache";
##如果缓存对象大于0,就代表使用了缓存发送给客户。
}
else{
set resp.http.X-Cache = "MISS from westos cache";
##缓存没有抓到代表错过缓存。
}
return (deliver);
}
服务机2(安装了HTTPD服务):
效果:
varnishadm ban req.url "~" / ##清除所有缓存
varnishadm ban req.url "~" /index.html ##清除网页缓存
3.定义不同域名站点的后端服务器
实验效果也就是在访问不同域名的网站,为其服务的后端服务器也不相同。
代理机:
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.30.2";
.port = "80";
}
backend web2 {
.host = "172.25.30.3";
.port = "80";
} ##定义两个后端服务器,并设置http端口。
sub vcl_recv {
if (req.http.host ~"^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = web1; ##如果访问信息是以www.westos开头,或在以westos开头,
都把域名设置为www.westos.org,由后端服务器1为其服务。
}elsif (req.http.host ~"^bbs.westos.org") {
set req.backend_hint = web2; ##访问域名为bbs.westos.org,则由后端服务器2为其服务。
}else {
return (synth(405)); ##返回报错
}
}
systemctl restart varnish ##重启Varnish。
后端服务器1,2:
设置服务界面,打开http服务。
实验机(设置一个没有使用过的域名,否则会出现不了自己定义的界面):
vim /etc/hosts
172.25.30.1 server1 www.westos.org westos.org bbs.westos.org ##添加域名解析
实验结果:
4.负载均衡
如果有许多个人访问当前页面,只有一台服务机就有可能导致后端服务器的崩溃,所以设置两台甚至多台来对服务轮流响应。以减轻服务器的压力,也使其反映速度增快。
代理服务机:
vim /etc/varnish/default.vcl
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so"; ##引入负载均衡所用模块
backend web1 {
.host = "172.25.30.2";
.port = "80";
}
backend web2 {
.host = "172.25.30.3";
.port = "80";
} ##定义两个后端服务器
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
} ##定义负载均衡
sub vcl_recv {
if (req.http.host ~"^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend(); ##当访问 www.westos.org 时,请求转到 lb
return (pass); ##不进行缓存
}elsif (req.http.host ~"^bbs.westos.org") {
set req.backend_hint = web2;
}else {
return (synth(405));
}
}
后端服务器1,2:
设置服务界面,打开http服务。
实验机(设置一个没有使用过的域名,否则会出现不了自己定义的界面):
vim /etc/hosts
172.25.30.1 server1 www.westos.org westos.org bbs.westos.org ##添加域名解析
实验结果:
5.cdn 推送平台
1).实验4可以看出www.westos.org与bbs.westos.org使用的都是页面server3,所以应该对其进行一个区分,在服务机3上配置Apache虚拟主机。
服务机3:
vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
<Directory "/www">
Require all granted
</Directory> ##定义虚拟主机访问文件夹www
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
Require all granted
</Directory> ##定义虚拟主机访问文件夹bbs
mkdir /bbs ##新建目录
mkdir /www
vim /bbs/index.html ##新建访问界面
vim /www/index.html
代理机与实验4相同。
实验效果:
2)CDN推送
当后端服务器中的内容有更新的时候,在 varnish 的缓存中应该及时地同步后端服务器中的内容。相当于清空varnish 中的缓存,当下一次进行访问时,直接从服务器中获取新的内容。
代理服务器:
backend web1 {
.host = "172.25.30.2";
.port = "80";
}
backend web2 {
.host = "172.25.30.3";
.port = "80";
} ##设置后端服务器
acl westos {
"127.0.0.1";
"172.25.30.0"/24;
} ##设置访问控制白名单,允许本机与172.25.30网段上主机访问
sub vcl_recv {
if (req.method == "BAN") {
if (!client.ip ~ westos) {
return(synth(405,"Purging notallowed for " + client.ip));
}
ban("req.url ~ " + req.url);
return(purge);
}
}
sub vcl_deliver {
if (obj.hits>0){
set resp.http.X-Cache = "HIT from west cache" ;
}
else{
set resp.http.X-Cache = "MISS from west cache" ;
}
return (deliver);
}
cd /mnt/ ##安装所需php httpd unzip
cd varnish/
yum install unzip php
unzip bansys.zip -d /var/www/html/
yum install httpd
unzip bansys.zip -d /var/www/html/
cd /var/www/html/
mv bansys/* /var/www/html/
vim config.php
vim config.php ##编写推送页面
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.30.1'),
'port' => '8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.com' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
vim /etc/httpd/conf/httpd.conf
##修改httpd端口,原本为80,Varnish所使用端口也是80,将端口改为8080.
实验效果图:
如果没有推送成功,第二次应该出现HIT,但是出现的是MISS,证明缓存已被清除。