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

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

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

在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。

一.部署单个后端服务器的varnish过程

1.在官网下载varnish-libs-3.0.5-1.el6.x86_64.rpm和varnish-3.0.5-1.el6.x86_64.rpm

yum install varnish-3.0.5-1.el6.x86_64.rpm
yum install varnish-libs-3.0.5-1.el6.x86_64.rpm

2.编辑varnish文件

vim /etc/sysconfig/varnish
  将66行改为:VARNISH_LISTEN_PORT=80
  # 以下不用修改,只是查看
  第8行 NFILES=131072         # 最多能打开的文件数,varnish会自动调整该值
  第12行 MEMLOCK=82000        # 最多能使用的内存空间,varnish会自动调整该值
  第15行 NPROCS="unlimited"   # 单个用户所能运行的最大线程数

基于Varnish的CDN加速缓存服务器的搭建
3.修改varnish用户的限制文件
因为varnish这个程序运行在varnish这个用户的私有空间内,内核对普通用户限制的最大文件数为1024.对varnish用户限制的最大文件数为131072,我们需要满足131072这个最大值。

vim /etc/security/limits.conf
  varnish         -       nofile          131073   # 满足最多能打开的文件数
  varnish         -       memlock         82000
  varnish         -       nproc           unlimited
  # 将后边的数字和上边文件中对应项改为相等

基于Varnish的CDN加速缓存服务器的搭建
4.打开varnish服务

/etc/init.d/varnish start

基于Varnish的CDN加速缓存服务器的搭建
5.在varnish默认文件中写上后端服务器的IP及端口

vim /etc/varnish/default.vcl
backend default {
  .host = "172.25.70.2";      # 后端服务器的ip
  .port = "80";              # 后端服务器的端口
}

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from taylor cache";   
# 在varnish中命中HIT访问的域名
}
else {
set resp.http.X-Cache = "MISS from taylor cache";
# 后端服务器中得到MISS访问的域名
}
return (deliver);
}

基于Varnish的CDN加速缓存服务器的搭建
5.编写配置文件后要重新加载默认文件

/etc/init.d/varnish reload   # 这是必须的

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

6.在物理机中的/etc/hosts中写www.taylorswift.com的解析—>172.25.70.1(varnish主机)

172.25.70.1 server1 www.taylorswift.com

基于Varnish的CDN加速缓存服务器的搭建
在server2(后端服务器)中安装httpd服务并在Apach默认发布目录中写默认发布文件
基于Varnish的CDN加速缓存服务器的搭建
7.在物理机中测试:

curl -I www.taylorswift.com

第一次,没有缓存
基于Varnish的CDN加速缓存服务器的搭建
第二次,有缓存
基于Varnish的CDN加速缓存服务器的搭建

二、具有多台后端服务器的varnish

1.server3安装httpd服务,在httpd的默认发布目录下编辑默认发布文件index.html

<h1>server3 - music.taylor.com</h1>

2.将music解析到物理主机

vim /etc/hosts

172.25.70.1 server1 www.taylorswift.com music.taylorswift.com

基于Varnish的CDN加速缓存服务器的搭建
3.配置varnish的server1default文件

vim /etc/varnish/default.vcl


backend web1 {     # 后端第一个服务器名web1
  .host = "172.25.70.2";   
  #将server2 www.taylorswift.com作为第一个服务器主机
  .port = "80";
}
backend web2 {     # 后端第二个服务器名web2
.host = "172.25.70.3"
#将server3 music.taylorswift.com作为第二个服务器主机
  .port = "80";
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?taylorswift.com") {     
# 解析域名是taylorswift.com 或www.taylorswift.com,均访问172.25.70.2->server2
set req.http.host = "www.taylorswift.com";
set req.backend = web1;
} elsif (req.http.host ~ "^music.taylorswift.com") {   
# 解析域名为music.taylorswift.com,访问172.25.70.3->server 3
set req.backend = web2;
} else {error 404 "taylor cache";   
# 如果访问的域名不是这三者,404的错误
}
}

基于Varnish的CDN加速缓存服务器的搭建
default文件每次编写完后都要reload varnish

/etc/init.d/varnish reload   # 这是必须的

4.物理机中的访问测试:
不同域名访问不同页面
基于Varnish的CDN加速缓存服务器的搭建

三、varnish后端服务器的负载均衡

1.什么是负载均衡
负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。
负载均衡算法的种类有很多种,常见的负载均衡算法包括轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等,应根据具体的使用场景选取对应的算法。在varnish中我们采用的是轮询法,平衡对待每一个后端服务器。

2.在server3的httpd的默认发布目录中建立两个虚拟主机

[[email protected] ~]# mkdir /www
[[email protected] ~]# cd /www/
[[email protected] www]# vim index.html
[[email protected] www]# cat index.html
server3 - www.taylorswift.com
[[email protected] www]# mkdir /music
[[email protected] www]# cd /music/
[[email protected] music]# vim index.html
[[email protected] music]# cat index.html 
server3 - music.taylorswift.com
=======================================
vim /etc/httpd/conf/httpd.conf

990 NameVirtualHost *:80
1011 <VirtualHost *:80>
1012     DocumentRoot /www
1013     ServerName www.taylorswift.com
1014 </VirtualHost>
1015 <VirtualHost *:80>
1016     DocumentRoot /music
1017     ServerName music.taylorswift.com
1018 </VirtualHost>

将990行注释打开

3.在varnish主机server1中的defaults文件中写入负载均衡函数:

 director taylor round-robin {   # 采用round-robin算法
{ .backend = web1; }
{ .backend = web2; }
}

Round Robin(中文翻译为轮询调度)是一种以轮询的方式依次将一个域名解析到多个IP地址的调度不同服务器的计算方法。

sub vcl_recv {
if (req.http.host ~ "^(www.)?taylorswift.com") {
set req.http.host = "www.taylorswift.com";
set req.backend = taylor;  # 调用平衡轮叫函数
#return (pass);    # 写pass表明不经过缓存直接去后端服务器拿数据
} elsif (req.http.host ~ "^music.taylorswift.com") {
set req.backend = web2;
} else {error 404 "taylor cache";
}
}

4.default文件每次编写完后都要reload varnish

/etc/init.d/varnish reload   # 这是必须的

5.server3的httpd服务重启

/etc/init.d/httpd restart

6.在物理主机中的测试(因为varnish自带缓存功能,所以为看到轮询功能,在轮询函数中添加pass参数。等于屏蔽了它的缓存功能。)

curl www.taylorswift.com
curl  music.taylorswift.com

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

如果第一次出现server2(server3),那么120秒内都是server2(server3),因为server2(server3)将数据进行了缓存;

如果访问时间大于120s,它会出现server3(server2)(因为负载均衡采用的算法是平衡轮叫,server2和server3是公平地被访问的)

如果在默认函数中写上pass,那么它每次都直接从后端服务器中直接取,一次server2一次server3

健康检查:
通过健康检查来确定服务器和应用的健康状况是负载均衡器器一个非常重要的功能。没有负载均衡器,客户端可能会将请求发送到已经停机的服务器上。网络管理员必须手动干预替换这台服务器,或者排除服务器的故障。有时服务器可能没有停机,但是因为某种原因,比如软件的漏洞,服务器上面运行的应用系统已经不能正常工作。比如Web应用可能正常运行,但它返回的页面却是错误的内容。负载均衡器能够检测这些情况并立即将客户请求导向到正常的服务器而不需要管理员的干预。