基于Varnish的CDN加速缓存服务器的搭建

什么是varnish?

官方解释:
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器。

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

其中有两个点:
1、方向代理服务器
2、http加速器

搭建CDN的方式

市面上有很多CDN供应商,比较著名有Akamai (全球最大),chinacache,webluker,cloudflare,chinacache,如果需要自己搭建CDN系统,有3种主流方案可以选择squid,varnish,Nginx+memcache

varnish和squid的区别

之前的squid加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的硬盘里,客户读取的速率很慢,代理的效率低
现在的varnish加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的内存里,客户读取的速率很快,代理的效率高

varnish的工作原理

Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要 做cache的工作)进程。
master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
针对文件缓存部分,master读入存储配置,调用合适的存储类型,然后创建/读入相应大小的缓存大文件。
接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。
在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中
(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap)
此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。
接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,
然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,
如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。
为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。
然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。
如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。
如果缓存已满,就根据LRU机制,把最旧的object释放掉。
释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期
如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存
注意释放时会检查该存储内存块前面或后面的空闲内存块
如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。
整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中
如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。

varnish的工作方式

1、作为代理以及具有缓存作用的功能
2、只作为一个代理服务器工作

部署单个varnish服务器

1、安装3个虚拟机;采用的是创建快照的方式进行创建多个虚拟机。
2、安装varnish软件
在这里插入图片描述
3、查看varnish服务的一些基本配置信息

rpm -qa | grep varnish查看版本
rpm -qc varnish查看一下服务的配置文件

在这里插入图片描述
/etc/varnish/varnish.params是服务的基本配置文件
编辑配置文件
vim /etc/varnish/varnish.params

VARNISH_LISTEN_PORT=6081		##服务端口为6081

在这里插入图片描述
在这里插入图片描述
查看varnish的用户信息
安装varnish服务之后就会自动建立这个用户
在这里插入图片描述
查看vatnish.service脚本
vim /usr/lib/systemd/system/varnish.service是varnish服务启动脚本
里面有一些最基本的参数:
允许开启的文件个数 内存锁定大小

在这里插入图片描述

在这里插入图片描述
ulimit -l查看系统的内存大小

free -m查看系统的剩余内存
在这里插入图片描述

sysctl -a | grep file查看系统允许开启文件的最大个数
在这里插入图片描述
查看内核对普通用户限制的最大文件数:
在这里插入图片描述
更改配置文件中的内核限制参数:
varnish程序是被varnish用户直接运行的,运行过程中占用的是varnish用户的私有空间,
在这里插入图片描述在这里插入图片描述
更改varnish的监听端口,为了测试,这个端口根据自己的需求使用。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述server2模拟一台http服务器

搭建一台http服务器提供httpd服务

yum install -y httpd
systemctl start httpd
vim /var/www/html/index.html
I am server2
curl localhost可以看到web已经搭建好了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
server1模拟varnish服务器,server2模拟后端http服务器
编辑server1上varnish后端服务器的配置文件

vim /etc/varnish/defaults.cvl
将ip改为后端http服务器的IP地址
端口改为80
重启varnish服务
systemctl restart varnish
查看开启的服务以及监听端口
netstat -tnlp

在这里插入图片描述在这里插入图片描述
在客户端进行测试

真机想通过server1(varnish代理缓存服务器)访问server2(web服务器)的web资源
客户端测试的时候,curl的是server1的IP地址,但是结果是server2提供的内容
在这里插入图片描述
为了测试缓存功能,我们在varnish的配置文件中添加模块的测试内容:

在这里插入图片描述
在这里插入图片描述
客户端进行测试:
curl -I 192.168.181.165

在这里插入图片描述在这里插入图片描述
在server1上面情书所有的访问缓存
varnishadm ban req.url “~” /
清除缓存,继续在客户端进行测试,这次的结果就变成The first htt

在这里插入图片描述
在这里插入图片描述

多台后端http服务器,varnish实现负载均

图形化清除缓存
server1上:
安装http,编写配置文件:
yum install httpd -y
systemctl start httpd
在这里插入图片描述
systemctl restart httpd #重启服务
在这里插入图片描述
测试httpd服务
vim /var/www/html/index.html
I am server1
systemctl restart httpd
检测一下
curl localhost:8080
在这里插入图片描述
下载bansys.zip ,并进行解压
yum install unzip -y #下载解压命令软件
unzip bansys.zip -d /var/www/html/ #指定解压目录

安装php(使得httpd服务可以识别php格式的内容)

yum install php -y

编辑发布内容,并重启服务

在这里插入图片描述
在这里插入图片描述

使用vainish加速器实现两个web后端服务器之间的负载均衡

实际上企业当中的web后端服务器(为客户端提供资源的服务器)的性能有好有坏
性能差一点的就让它少干一点活,性能好的就多分担一点
现在就是node2这个web服务器性能比较差,node3这个服务器性能比较好
客户端通过varnish加速器访问node2的时候去轮询node3
实际上node2和node3上面存放的资源一模一样,只是为了实验效果明显起见,写为www.westos.org和bbs.westos.org
当客户端第一次访问node2的时候varnish去问node2要资源
当客户端第二次访问node2的时候varnish去问node3要资源
这个时候node2和node3上面的资源一模一样,客户端根本察觉不到,也缓解了node2(性能差)的访问压力
客户端通过varnish加速器访问node3的时候只去找node3(性能好)
node01

vim /etc/varnish/default.cvl
在上面写入:
import directors from “/usr/lib64/varnish/vmods/libvmod_directors.so”;(调度模块)
在下面写入:
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
表示在web1(node2)和web2(node3)之间实现负载均衡
在下面修改:
sub vcl_recv {
if (req.http.host ~ “^(www.)?westos.org”) {
set req.http.host = “www.westos.org”;
set req.backend_hint = lb.backend();访问web1的时候去轮询web2
} elsif (req.http.host ~ “^bbs.westos.org”) {
set req.backend_hint = web2;
} else { return (synth(405));
}

在这里插入图片描述
systemctl restart varnish修改完之后重启服务

此时的vainish是默认会缓存每一个访问到的资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
curl www.westos.org发现node2和node3负载均衡
curl bbs.westos.org没有负载均衡,只有node3提供资源
现在其实web1上面的资源和web2上面的资源一样
当客户通过node1代理去找node2和node3的时候
应该实现调度,负载均衡,在node1上面实现负载均衡
使找node2的资源的时候负载均衡(这里使用轮询方式),性能不好的服务器
使找node3的资源的时候不负载均衡,因为他的性能比较好

实现图形化清除缓存

从真机给node1代理传一个压缩包,讲压缩包传给varnish服务器,并对其进行配置:

开始在node1上面搭建服务
yum install -y unzip php httpd安装这些服务
unzip bansys.zip -d /var/www/html解压到apache下
cd /var/www/html
ls
cd bansys/
mv * …/
cd .
.
ls
cd bansys/
vim config.php改php图形化服务的配置文件
改ip是172.25.12.1,apahce端口为8080 域名改为www.westos.org(对这个域名的数据进行缓存清理) vim
/etc/httpd/conf/httpd.conf apahce端口为8080
systemctl restart httpd
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编辑代理服务器的权限列表

vim /etc/varnish/default.cvl
写入权限列表:
acl westos{
“127.0.0.1”;主机自己
“172.25.12.0”/24;这个网段的所有主机都有权限清理代理服务器上面的缓存
}
再写入:
if (req.method == “BAN”) {
if (!client.ip ~ westos) {
return (synth(405,“Not allowed.”));
}如果不是允许的ip就拒绝清理
ban("req.url ~ " + req.url);
return(purge);如果是就清理缓存
}
注释:return(pass),这个会一直清除缓存,之前的实验做的
清除这个代理服务器就不会缓存资源了,直接从服务器请求资源给客户端
systemctl restart varnish

测试:
curl -I www.westos.org 是miss
curl -I www.westos.org 是hit
curl -I www.westos.org 是hit
然后图形化清除缓存,输入.*,发送(清除所有缓存)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了57 篇原创文章 · 获赞 0 · 访问量 1318

猜你喜欢

转载自blog.csdn.net/weixin_45674039/article/details/103673901
今日推荐