1. CDN的介绍
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN网络中包含的功能实体包括内容缓存设备、内容交换机、内容路由器、CDN内容管理系统等组成。内容服务基于缓存服务器,也称作代理缓存。包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件。
2. CDN的实现
实验环境:
在servera作为CDN
在所有试验机中需要关闭火墙,selinux,NetworkManager 避免影响
[root@serverc ~]# systemctl stop NetworkManager
[root@serverc ~]# systemctl disable NetworkManager
[root@serverc ~]# systemctl stop firewalld.service
[root@serverc ~]# systemctl disable firewalld.service
[root@serverc ~]# vim /etc/sysconfig/selinux ##关闭selinux
在serverb上作为CDN转交请求的对象
安装httpd

在serverc上作为CDN转交请求的对象
安装httpd

在rhel7主机充当用户访问

2.1 varnish的安装
Varnish是一款高性能的开源HTTP加速器

2.2 使系统与varnish匹配
1.修改varnish的启动脚本中的端口号
vim /usr/lib/systemd/system/varnish.service


2.检查系统允许的最大文件数和内存
注意:检查系统允许打开的最大文件数和内存需要大于varnish中允许端最大文件数。
sysctl -a | grep file

如果系统允许的最大文件数少于varnish中的最大文件数可以通过给系统增加内存的方式。
ulimit -a

3.使系统允许varnish需要的运行内存和最大文件数
vim /etc/security/limits.conf

4.varnish的启动
systemctl start varnish 启动varnish
netstat -ntlp 检查端口是否打开


2.3 varnish的配置文件
varnish的配置文件——/etc/varnish/default.vcl
[root@servera ~]# rpm -qa | grep vanish
[root@servera ~]# rpm -qa | grep varnish
varnish-6.4.0-1.el7.x86_64
[root@servera ~]# rpm -qc varnish-6.4.0-1.el7.x86_64
/etc/ld.so.conf.d/varnish-x86_64.conf
/etc/logrotate.d/varnish
/etc/varnish/default.vcl

2.4 varnish的命令行管理
varnishadm

3.CDN的功能
3.1实现CDN的反向代理功能(内容转发)
vim /etc/varnish/default.vcl修改CDN配置文件
# 4.0 or 4.1 syntax.
vcl 4.1;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "192.168.43.20";
.port = "80";
}
systemctl restart varnish


测试:

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
注意:开启varnish后有两个进程

3.2实现CDN缓存内容
1.实现缓存功能
vim /etc/varnish/default.vcl修改CDN配置文件
vcl 4.1;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "192.168.43.20";
.port = "80";
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}

2.手动清理缓存
如果访问目标更新,可以手动清除缓存
varnishadm ban req.url "~" /清空所有缓存


varnishadm ban req.url "~" /index.html清空发布页面的缓存



3.3实现CDN负载均衡的功能
1.请求不同域名(同一IP),分配不同后端
CDN(servera)把请求均分到后端(serverb和serverc)
vcl 4.1;
.host = "192.168.43.20";
.port = "80";
}
backend serverc {
.host = "192.168.43.30";
.port = "80";
}
ub vcl_recv {
if (req.http.hosts ~ "^(www.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = web1;
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}



测试:
2.负载均衡,轮循请求
serverb与serverc轮循被访问,实现负载均衡
实现负载均衡需要导入vmod_directors模块
man vcl 可查看vcl的语法
man vmod_directors 查看模块的导入

调度器的模块:/usr/lib64/varnish/vmods/libvmod_directors.so

vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
backend web1 {
.host = "192.168.43.20";
.port = "80";
}
backend web2 {
.host = "192.168.43.30";
.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.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = lb.backend();
#return (pass);
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}




测试:


3.4 bansys实现CDN推送
我们在实现CDN高速缓存时有些时候通过命令等对CDN的管理有些麻烦,我们就可以使用CDN推送的方法同步后端服务内容
1.在CDN服务器安装httpd、php

2.在bansys配置文件中设定主机并绑定


vim config.php
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('192.168.43.10'),
'port' => '8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.red.com' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>

vim /etc/httpd/conf/httpd.conf

vim /etc/varnish/default.vcl
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
acl red {
"127.0.0.1";##本机IP
"192.168.43.0"/24; ##允许访问的IP
}
backend web1 {
.host = "192.168.43.20";
.port = "80";
}
backend web2 {
.host = "192.168.43.30";
.port = "80";
}
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
if (req.method == "BAN"){ ##清除缓存
if(!client.ip ~ red){
return (synth(405,"Not allow"));
}
ban("req.url ~"+ req.url);
return (purge)
}
if (req.http.host ~ "^(www.)?red.com"){
set req.http.host = "www.red.com";
set req.backend_hint = lb.backend();
}
elsif (req.http.host ~ "^bbs.red.com"){
set req.backend_hint = web2;
}
else {
return (synth(405));
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from CDN cache";
}
else {
set resp.http.X-Cache = "MISS from CDN cache";
}
return (deliver);
}



测试:




3.5 varnish的处理流程

本文介绍了CDN的工作原理,并详细阐述了如何使用varnish搭建CDN,包括varnish的安装、系统配置、配置文件编辑和命令行管理。同时,文章还讲解了CDN的反向代理、缓存、负载均衡功能的实现,以及通过bansys进行CDN内容推送的方法。
946

被折叠的 条评论
为什么被折叠?



