CDN加速的实现 --- varnish

Posted uthnb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDN加速的实现 --- varnish相关的知识,希望对你有一定的参考价值。

一、什么是CDN

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

   varnish是一款具有高性能的开源HTTP加速器,具有方向代理、缓存的功能。

二、部署单个后端服务器的varnish过程

   1.在官网下载软件包:varnish-libs-3.0.5-1.el6.x86_64.rpm和 varnish-3.0.5-1.el6.x86_64.rpm

   2、安装varnish:(安装完成后,可以在/etc/passwd中查看已经生成的varnish用户;所以对varnish的访问控制也相当于通过对varnish用户控制来实现)

   --->  yum  install  varnish-3.0.5-1.el6.x86_64.rpm   -y

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

   3、编辑varnish文件

   --->  /etc/sysconfig/varnish                # 只修改文件的接听端口为80即可 

 第66行修改:VARNISH_LISTEN_PORT=80

 第8行查看:NFILES=131072                    # 表示能打开的最大文件数(varnish用户可自动调整)

 第12行查看:MEMLOCK=82000                   # 表示最多可使用的内容空间(varnish用户可自动调整)

 第15行查看:NPROCS=‘unlimited’              # 表示单个用户可运行的最大线程数 

 

   4、编辑varnish用户的限制文件

   --->  vim  /etc/security/limits.conf        # 只需要在末尾添加如下信息即可

 varnish     -      nofile      131072

 varnish     -      memlock     82000

 varnish     -      nproc       unlimited

 # 注意:此时的最后一列信息与3文件中的内容想对应

   5、打开virnish服务器

   ---> /etc/init.d/varnish  start

   6、在默认文件中添加访问后端服务器的ip、端口、是否命中执行的相关代码(varnish主机为172.25.2.1)

   ---> /etc/varnish/default.vcl  

 baskend  default {

   .host = "172.25.2.2"

   .port = "80"

 }

 sub  val_deliver { 

   if (obj.hits > 0){

   set resp.http.X-Cache = "HIT  from westos cache";

   # 在vainish中命中HTT访问的域名

   }

   else{ 

   set resp.http.X-Cache = "MISS  from westos cache";

   # 在后端赴服务器中得到MISS访问的域名

   }

   return (deliver)

  }

   7、默认配置文件修改之后,要进行文件的加载

 

   --->  vim  /etc/init.d/varnish   reload

   8、在后端服务器中安装并开启httpd服务,关闭火墙

   --->  yum install httpd  -y

   --->  /etc/init.d/httpd  start

   --->  iptables  -L       # 查看火墙是关闭状态

   9、在后端服务器添加一个默认发布目录

   ---> vim /var/www/html/index.html

        <h1>server2 --- www.xniu.com<h1>

   --->  /etc/init.d/httpd  restart

   10、此时可以在物理主机中进行测试

   --->  curl  -I  172.25.2.1          # 第一次,显示从后端服务器获取。第二次显示从varnish缓存中获取

   注释:### 通过 varnishadm 手动清除缓存

        varnishadm ban.url .*$          #清除所有
        varnishadm ban.url /index.html  #清除 index.html 页面缓存
        varnishadm ban.url /admin/$     #清除 admin 目录缓存

 

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

   1、打开vm3主机;并设置ip为172.25.2.3,主机名为server3

   ---> vim /etc/sysconfig/network          # 修改主机名

        hostname=server3

   ---> vim /etc/sysconfig/network-scripts/ifcfg-eth0

        IPADDR=172.25.2.3

   2、在server3中安装httpd服务、并编辑默认发布目录

   ---> vim  /var/www/html/index.html

        <h1>server3 --- www.linux.com </h1>

   --->  /etc/init.d/httpd  restart

   3、在物理主机中添加解析

   --->  vim  /etc/hosts 

         172.25.2.1   www.linux.com  www.xniu.com  xniu.com

   4、配置varnish的默认文件

   --->  vim  /etc/varnish/default.vcl

 

 backend web1 {          # 后端的第一个服务器web1

  .host = "172.25.2.2";  # 当www.xniu.com访问跳转到server2主机
  .port = "80";
 }
 backend web2 {           # 后端的第二个服务器web2
   .host = "172.25.2.3";  # 当www.linux.com访问跳转server3
   .port = "80";
 }
 #当访问 www.xniu.com或xniu.com 域名时从 web1 上取数据,访问 www.linux.com 域名时到 web2 取数据。访问其他页面报错。
 sub vcl_recv {
 if (req.http.host ~ "^(www.)?xniu.com") {
 set req.http.host = "www.xniu.com";
 set req.backend = web1;
 } elsif (req.http.host ~ "^www.linux.com") {
 set req.backend = web2;
 } else {error 404 "westos cache";
 }
 }

   --->  /etc/init.d/varnish  reload

 

   5、在物理主机中测试(此时,两个结果是不一样的)

   ---> curl -I www.linux.com

   ---> curl -I www.xniu.com

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

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

   2、在server3中httpd默认发布目录进行如下操作

   --->  vim /etc/httpd/conf/httpd.conf         # 将990行的注释打开

 <VirtualHost *:80>

     DocumentRoot  /var/www/html

     ServerName  www.linux.com

 </VirtualHost>

 

 <VirtualHost *:80>

     DocumentRoot  /www1

     ServerName  www.xniu.com

 </VirtualHost>

 

 

 

   3、在server3中创建/www1目录,并添加index.html;填写内容为 www.xniu.com

   4、在varnish主机的默认文件中进行如下添加:

 

  director lb round-robin {    # 为轮询法
  { .backend = web1;}
  { .backend = web2;}
  #把多个后端聚合为一个组,并检测后端健康状况
  }

 

  sub vcl_recv {
  if (req.http.host ~ "^(www.)?xniu.com") {
  set req.http.host = "www.xniu.com";
  set req.backend = lb;
  return (pass);        # 表示不经过缓存,直接取服务器取拿东西
  } elsif (req.http.host ~ "^www.linux.com") {
  set req.backend = web2;
  } else {
  error 404 "westos cache";
  }
  }

 

    ---> /etc/init.d/varnish  reload

   5、在物理主机中测试:

    ---> cutl -I www.xniu.com

    分析:会出现轮询现象。若第一次出现server2 --- www.xniu.com(server2),则在120s内均为该结果(由于varnish对数据进行了缓存);经过120s后,显示结果变为www.xniu.con(server3);出现这样的结果,是由于轮询算法,server2和server3平均被访问。如果默认写上pass之后,则每次属性www.xniu.com界面,会出现上述两个结果交替出现的现象。若server2或者server3中有一个httpd服务损坏后,客户端依然可以访问号的哪个服务器。

 

 

 

   


 














































































以上是关于CDN加速的实现 --- varnish的主要内容,如果未能解决你的问题,请参考以下文章

用CDN加速OSS源站的操作步骤详解

用阿里云CDN加速OSS源站的方法步骤

用阿里云CDN加速OSS源站的方法步骤

CDN加速的实现 --- varnish

CDN技术详解

为啥越来越多的网站选择CDN加速?CDN加速有啥作用?